Кластеризация только столбца в двоичной матрице с python - PullRequest
0 голосов
/ 24 апреля 2020

Мне понадобится некоторая помощь для кластеризации моего 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

Я знаю, что некоторые методы существуют, но они просят уже иметь представление о количестве желаемых кластеров, но я не имею ни малейшего представления о числе кластера у меня будет.

У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 24 апреля 2020

Это немного другой подход. Но, возможно, это поможет добиться успеха. Я предлагаю использовать расчет расстояния. Вот мои тестовые данные:

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]]

Вы можете использовать это для сортировки по расстоянию от любого столбца, т.е. до 4-го столбца, изменив d[:,0] на d[:,4] в приведенном выше блоке.

...