Переупорядочение элементов матрицы для отражения столбца и строки, кластеризирующейся в наивном Python

Я ищу способ выполнить кластеризацию отдельно на матричных строках и, чем на ее столбцах, переупорядочить данные в матрице для отражения кластеризации и соединения все это. Кластеризирующаяся проблема легко разрешима, так создание древовидной схемы (например, в этом блоге или в "Программировании коллективного разума"). Однако то, как переупорядочить данные, остается неясным для меня.

В конечном счете я ищу способ создать графики, подобные тому ниже использования наивного Python (с любой "стандартной" библиотекой, такие как numpy, matplotlib и т.д., но не используя R или другие внешние инструменты).

dendogram
(источник: warwick.ac.uk)

Разъяснения

Меня спросили, что я подразумевал под переупорядочением. При кластеризации данных в матрице сначала матричными строками, затем ее столбцами, каждая ячейка матрицы может быть определена положением в этих двух древовидных схемах. При переупорядочении строк и столбцов исходной матрицы, таким образом, что элементы, которые близки каждый к другому в древовидных схемах, становятся близко каждым другому в матрице и затем генерируют heatmap, кластеризация данных может стать очевидной для средства просмотра (как в числе выше)

27
задан Glorfindel 1 July 2019 в 13:04
поделиться

2 ответа

См. Мой недавний ответ , частично скопированный ниже, на этот связанный вопрос .

import scipy
import pylab
import scipy.cluster.hierarchy as sch

# Generate features and distance matrix.
x = scipy.rand(40)
D = scipy.zeros([40,40])
for i in range(40):
    for j in range(40):
        D[i,j] = abs(x[i] - x[j])

# Compute and plot dendrogram.
fig = pylab.figure()
axdendro = fig.add_axes([0.09,0.1,0.2,0.8])
Y = sch.linkage(D, method='centroid')
Z = sch.dendrogram(Y, orientation='right')
axdendro.set_xticks([])
axdendro.set_yticks([])

# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.8])
index = Z['leaves']
D = D[index,:]
D = D[:,index]
im = axmatrix.matshow(D, aspect='auto', origin='lower')
axmatrix.set_xticks([])
axmatrix.set_yticks([])

# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.8])
pylab.colorbar(im, cax=axcolor)

# Display and save figure.
fig.show()
fig.savefig('dendrogram.png')

Dendrogram and distance matrix
(источник: stevetjoa.com )

42
ответ дан 28 November 2019 в 05:10
поделиться

Я не уверен, что полностью понимаю, но похоже, что вы пытаетесь переиндексировать каждую ось массива на основе видов признаков дендрограммы. Я полагаю, что это предполагает наличие некоторой сравнительной логики в выделении каждой ветви. Если это так, то будет ли это работать(?):

>>> x_idxs = [(0,1,0,0),(0,1,1,1),(0,1,1),(0,0,1),(1,1,1,1),(0,0,0,0)]
>>> y_idxs = [(1,1),(0,1),(1,0),(0,0)]
>>> a = np.random.random((len(x_idxs),len(y_idxs)))
>>> x_idxs2, xi = zip(*sorted(zip(x_idxs,range(len(x_idxs)))))
>>> y_idxs2, yi = zip(*sorted(zip(y_idxs,range(len(y_idxs)))))
>>> a2 = a[xi,:][:,yi]

x_idxs и y_idxs - признаки дендрограммы. a - несортированная матрица. xi и yi - признаки нового массива строк/столбцов. a2 - отсортированная матрица, а x_idxs2 и y_idxs2 - новые, отсортированные признаки дендрограммы. Это предполагает, что при создании дендрограммы столбец/строка ветви 0 всегда сравнительно больше/меньше, чем 1.

Если ваши y_idxs и x_idxs не списки, а массивы numpy, то вы можете использовать np.argsort аналогичным образом.

5
ответ дан 28 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: