用python对二进制矩阵中的列进行聚类

2024-09-29 09:25:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一些帮助才能在我的矩阵中聚集我的binary values。 这是一个二进制矩阵,下面是一个例子:

G1  G2  G3  G4  G5  G6  G7  G8  G9  G10 G11 G12
Sp1 0   0   0   0   0   0   0   0   0   0   0   0
Sp2 1   1   1   1   1   0   0   0   0   0   0   0
Sp3 0   0   0   0   0   0   0   0   0   1   1   1
SP4 0   0   0   0   0   0   0   0   0   1   1   1
SP5 1   1   1   1   1   1   1   1   1   0   1   0
SP6 1   1   1   1   1   1   1   1   1   0   0   0
SP7 0   0   0   0   0   0   0   0   0   0   0   0
SP8 0   0   0   0   0   0   0   0   0   0   0   0
SP9 0   1   0   1   0   1   1   0   1   0   0   0

我想对the columns进行聚类,而不是对行进行聚类

其思想是获得相似点组的最佳可能表示形式。 在本例中,它应该如下所示:

    G8  G1  G3  G5  G9  G2  G4  G11 G10 G12
Sp1 0   0   0   0   0   0   0   0   0   0
Sp2 0   1   1   1   0   1   1   0   0   0
Sp3 0   0   0   0   0   0   0   1   1   1
SP4 0   0   0   0   0   0   0   1   1   1
SP5 1   1   1   1   1   1   1   1   0   0
SP6 1   1   1   1   1   1   1   0   0   0
SP7 0   0   0   0   0   0   0   0   0   0
SP8 0   0   0   0   0   0   0   0   0   0
SP9 0   0   0   0   1   1   1   0   0   0

我知道有些方法是存在的,但它们要求已经知道所需的集群数量,但我不知道我将拥有的集群数量

有人有主意吗


Tags: 矩阵sp3g4g1g2sp2g5g9
1条回答
网友
1楼 · 发布于 2024-09-29 09:25:00

这是一个有点不同的方法。但也许这会有助于事情的进展。我建议使用距离计算。这是我的测试数据:

from scipy.spatial.distance import pdist, squareform

m = np.random.randint(0,2,size=(10,10))
print(m)
[[1 1 1 1 0 0 0 1 0 0]
 [1 0 0 0 0 0 0 0 0 1]
 [1 0 1 1 1 0 1 0 0 0]
 [0 1 1 1 0 0 0 0 1 1]
 [0 1 0 0 1 0 0 0 1 0]
 [1 1 0 0 0 0 0 0 1 1]
 [0 0 1 1 1 1 1 1 0 0]
 [0 1 1 0 0 1 0 0 1 1]
 [1 0 1 1 1 0 0 1 0 0]
 [1 0 1 0 1 1 1 0 1 0]]

使用scipy.spatial.distance计算所有列之间的距离

d = squareform(pdist(m.T, 'hamming'))
print(d)
[[0.  0.7 0.5 0.5 0.5 0.7 0.5 0.5 0.7 0.6]
 [0.7 0.  0.6 0.6 0.8 0.6 0.8 0.6 0.2 0.3]
 [0.5 0.6 0.  0.2 0.4 0.4 0.4 0.4 0.6 0.7]
 [0.5 0.6 0.2 0.  0.4 0.6 0.4 0.2 0.8 0.7]
 [0.5 0.8 0.4 0.4 0.  0.4 0.2 0.4 0.6 0.9]
 [0.7 0.6 0.4 0.6 0.4 0.  0.2 0.4 0.4 0.5]
 [0.5 0.8 0.4 0.4 0.2 0.2 0.  0.4 0.6 0.7]
 [0.5 0.6 0.4 0.2 0.4 0.4 0.4 0.  0.8 0.7]
 [0.7 0.2 0.6 0.8 0.6 0.4 0.6 0.8 0.  0.3]
 [0.6 0.3 0.7 0.7 0.9 0.5 0.7 0.7 0.3 0. ]]

现在,您可以根据到列的距离进行排序

print(m[:,np.argsort(d[:,0])])
[[1 1 1 0 0 1 0 1 0 0]
 [1 0 0 0 0 0 1 0 0 0]
 [1 1 1 1 1 0 0 0 0 0]
 [0 1 1 0 0 0 1 1 0 1]
 [0 0 0 1 0 0 0 1 0 1]
 [1 0 0 0 0 0 1 1 0 1]
 [0 1 1 1 1 1 0 0 1 0]
 [0 1 0 0 0 0 1 1 1 1]
 [1 1 1 1 0 1 0 0 0 0]
 [1 1 0 1 1 0 0 0 1 1]]

您可以使用此选项,通过将上述块中的d[:,0]更改为d[:,4],按与任何列(即第4列)的距离进行排序

相关问题 更多 >