我需要一些帮助才能将我的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
我知道有些方法已经存在,但是他们要求已经对所需的簇数有了一个想法,但是我不知道我将要拥有的簇数。
有人有想法吗?
这是一种不同的方法。但这也许会帮助事情发展。我建议使用距离计算。这是我的测试数据:
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列)的距离进行排序。