Estoy buscando una manera de llevar a cabo la agrupación por separado en las filas de la matriz, y que en sus columnas, cambiar el orden de los datos en la matriz para reflejar la agrupación y ponerlo todo junto. La agrupación problema es fácilmente solucionable, por lo que es el dendrograma de la creación (por ejemplo, en este blog o en «La programación colectiva de la inteligencia»). Sin embargo, cómo cambiar el orden de los datos no está claro para mí.

Finalmente, estoy buscando una forma de crear gráficos similar a la de abajo con ingenua de Python (con el «estándar» de la biblioteca, tales como numpy, matplotlib, etc, pero sin el uso de R o de otras herramientas externas).

La reordenación de elementos de la matriz para reflejar la columna y fila de la agrupación en clústeres en naiive python

(fuente: warwick.ac.reino unido)

Aclaraciones

Me preguntaron qué me refería con el reordenamiento. Al agrupar los datos en una matriz en primer lugar por filas de la matriz, luego por sus columnas, cada celda de la matriz puede ser identificado por la posición en los dos dendrograms. Si usted reordenar las filas y las columnas de la matriz original tal que los elementos que están cerca el uno del otro en el dendrograms acercarse el uno al otro en la matriz y, a continuación, generar «mapa de calor», la agrupación de los datos puede ser evidente para el espectador (como en la figura de arriba)

  • ¿Que quiere decir la reordenación? Intercambio de vecinos n filas/columnas con otro n?
  • Usted desea utilizar numpy / scipy cuando se trata de las matrices de seguro. Matplotlib también imita Matlab bien. Aquí es un trato: si usted puede hacer esto en Matlab, puede hacerlo en scipy así (trivial sintaxis de la diferencia si la hubiere).
  • Ooh, +1 para el cuadro bonito 😉
  • Acabo de poner esto en github: github.com/WarrenWeckesser/heatmapcluster

3 Comentarios

  1. 41

    Ver a mi los últimos respuesta, copiado en la parte de abajo, para esta pregunta relacionada con la.

    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')

    La reordenación de elementos de la matriz para reflejar la columna y fila de la agrupación en clústeres en naiive python

    (fuente: stevetjoa.com)

    • Wow, solución agradable. Hacer matplotlib look sencillo, que creo que es toda una hazaña. Pero, ¿cómo, a continuación, agregue las etiquetas para los ejes x e y? Qué es necesario para utilizar twinx y twiny, o hay un método más sencillo.
    • Gracias. Me encanta matplotlib y yo lo uso mucho. iPython le ayuda a explorar matplotlib y pylab más. Para agregar etiquetas a los ejes de la matriz de distancias (foto centro), usted puede utilizar el set_xticks y set_xticklabels. Consulte matplotlib.sourceforge.net/api/…
  2. 5

    No estoy seguro de entender completamente, pero parece que usted está tratando de volver a índice de cada uno de los ejes de la matriz basada en la clase de el dendrograma indicies. Supongo que se supone que hay algunos comparativo de la lógica en cada rama de delineación. Si este es el caso, entonces sería este trabajo(?):

    >>> 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 y_idxs son el dendrograma indicies. a es el de seleccionados de la matriz. xi y yi son su nueva fila/columna de la matriz de indicies. a2 es la ordenada de la matriz, mientras que x_idxs2 y y_idxs2 son los nuevos, ordenados dendrograma indicies. Esto supone que cuando el dendrograma se ha creado un 0 rama de la columna/fila siempre es comparativamente más grande/más pequeño que un 1 rama.

    Si su y_idxs y x_idxs no están listas, pero son arrays de numpy, entonces usted podría utilizar np.argsort en una manera similar.

Dejar respuesta

Please enter your comment!
Please enter your name here