仅使用python封装二进制矩阵中的列

问题描述 投票:0回答:1

我需要一些帮助才能将我的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

我知道有些方法已经存在,但是他们要求已经对所需的簇数有了一个想法,但是我不知道我将要拥有的簇数。

有人有想法吗?

python python-3.x matrix cluster-computing distance
1个回答
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列)的距离进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.