Pergunta

Estou procurando uma maneira de executar o cluster separadamente nas linhas da matriz e do que em suas colunas, reordenar os dados na matriz para refletir o agrupamento e montar tudo. O problema de agrupamento é facilmente solucionável, assim como a criação do dendrograma (por exemplo, em este blog ou em "Inteligência coletiva de programação"). No entanto, como reordenar os dados ainda não está claro para mim.

Eventualmente, estou procurando uma maneira de criar gráficos semelhantes aos abaixo usando Python ingênuo (com qualquer biblioteca "padrão" como Numpy, Matplotlib etc., mas sem usando r ou outras ferramentas externas).

dendogram
(fonte: warwick.ac.uk)

Esclarecimentos

Perguntaram -me o que eu quis dizer reordenar. Quando você agrupa os dados em uma matriz primeiro por linhas de matriz, depois por suas colunas, cada célula da matriz pode ser identificada pela posição nos dois dendrogramas. Se você reordenar as linhas e as colunas da matriz original, de modo que os elementos que estão próximos um dos outros nos dendrogramas se aproximem um de outro na matriz e, em seguida, gerar mapa de calor, o agrupamento dos dados pode se tornar evidente para o espectador (como na figura acima)

Foi útil?

Solução

Veja meu resposta recente, copiado em parte abaixo, para esta pergunta relacionada.

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
(fonte: stevetjoa.com)

Outras dicas

Não tenho certeza de entender completamente, mas parece que você está tentando reiniciar cada eixo da matriz com base em tipos de indicios do dendrograma. Eu acho que isso pressupõe que exista alguma lógica comparativa em cada delineamento da ramificação. Se for esse o caso, então isso funcionaria (?):

>>> 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 e y_idxs são os indicios de dendrograma. a é a matriz não classificada. xi e yi são os seus novos indicios de linha de linha/coluna. a2 é a matriz classificada enquanto x_idxs2 e y_idxs2 são os novos indicios de dendrograma classificados. Isso pressupõe que quando o dendrograma foi criado, um 0 A coluna/linha da filial é sempre comparativamente maior/menor que um 1 ramo.

Se seus y_idxs e x_idxs não forem listas, mas são matrizes numpy, então você pode usar np.argsort de maneira semelhante.

Sei que isso é muito tarde para o jogo, mas fiz um objeto de plotagem com base no código da postagem nesta página. Está registrado no PIP, então para instalar você só tem que ligar

pip install pydendroheatmap

Confira a página do Github do projeto aqui: https://github.com/themantalope/pydendroeatmap

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top