means - trazado de resultados de la agrupación jerárquica ontop de una matriz de datos en python
k means code (2)
La pregunta no define la matriz muy bien: "matriz de valores", "matriz de datos". Supongo que te refieres a una matriz de distancia . En otras palabras, el elemento D_ij en la matriz D de distancia N-por-N simétrica no negativa denota la distancia entre dos vectores de características, x_i y x_j. ¿Es eso correcto?
Si es así, intente esto (editado el 13 de junio de 2010 para reflejar dos dendrogramas diferentes):
import scipy
import pylab
import scipy.cluster.hierarchy as sch
# Generate random 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 first dendrogram.
fig = pylab.figure(figsize=(8,8))
ax1 = fig.add_axes([0.09,0.1,0.2,0.6])
Y = sch.linkage(D, method=''centroid'')
Z1 = sch.dendrogram(Y, orientation=''right'')
ax1.set_xticks([])
ax1.set_yticks([])
# Compute and plot second dendrogram.
ax2 = fig.add_axes([0.3,0.71,0.6,0.2])
Y = sch.linkage(D, method=''single'')
Z2 = sch.dendrogram(Y)
ax2.set_xticks([])
ax2.set_yticks([])
# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.6])
idx1 = Z1[''leaves'']
idx2 = Z2[''leaves'']
D = D[idx1,:]
D = D[:,idx2]
im = axmatrix.matshow(D, aspect=''auto'', origin=''lower'', cmap=pylab.cm.YlGnBu)
axmatrix.set_xticks([])
axmatrix.set_yticks([])
# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.6])
pylab.colorbar(im, cax=axcolor)
fig.show()
fig.savefig(''dendrogram.png'')
Dendrograma y matriz de distancia http://up.stevetjoa.com/dendrogram.png
¡Buena suerte! Dejame saber si necesitas mas ayuda.
Editar: para diferentes colores, ajuste el atributo cmap
en imshow
. Consulte los documentos scipy / matplotlib para ver ejemplos. Esa página también describe cómo crear su propio mapa de color. Para mayor comodidad, recomiendo usar un mapa de colores preexistente. En mi ejemplo, utilicé YlGnBu
.
Editar: add_axes
( ver documentación aquí ) acepta una lista o tupla: (left, bottom, width, height)
. Por ejemplo, (0.5,0,0.5,1)
agrega un Axes
en la mitad derecha de la figura. (0,0.5,1,0.5)
agrega un Axes
en la mitad superior de la figura.
La mayoría de la gente probablemente use add_subplot
para su conveniencia. Me gusta add_axes
por su control.
Para eliminar el borde, use add_axes([left,bottom,width,height], frame_on=False)
. Ver ejemplo aquí.
¿Cómo puedo trazar un dendrograma justo encima de una matriz de valores, reordenados adecuadamente para reflejar la agrupación en Python? Un ejemplo es la siguiente figura:
https://publishing-cdn.elifesciences.org/07103/elife-07103-fig6-figsupp1-v2.jpg
Uso scipy.cluster.dendrogram para hacer mi dendrograma y realizar una agrupación jerárquica en una matriz de datos. ¿Cómo puedo luego trazar los datos como una matriz donde las filas se han reordenado para reflejar un agrupamiento inducido por el corte del dendrograma en un umbral particular, y tener el dendrograma trazado junto con la matriz? Sé cómo trazar el dendrograma en scipy, pero no cómo trazar la matriz de intensidad de datos con la barra de escala derecha al lado.
Cualquier ayuda sobre esto sería muy apreciada.
Si además de la matriz y el dendrograma se requiere mostrar las etiquetas de los elementos, se puede usar el siguiente código, que muestra todas las etiquetas girando las etiquetas xy cambiando el tamaño de la fuente para evitar la superposición en el eje x. Requiere mover la barra de color para tener espacio para las etiquetas y:
axmatrix.set_xticks(range(40))
axmatrix.set_xticklabels(idx1, minor=False)
axmatrix.xaxis.set_label_position(''bottom'')
axmatrix.xaxis.tick_bottom()
pylab.xticks(rotation=-90, fontsize=8)
axmatrix.set_yticks(range(40))
axmatrix.set_yticklabels(idx2, minor=False)
axmatrix.yaxis.set_label_position(''right'')
axmatrix.yaxis.tick_right()
axcolor = fig.add_axes([0.94,0.1,0.02,0.6])
El resultado obtenido es esto (con un mapa de color diferente):