Frage

Ich bin auf der Suche nach einer Möglichkeit, Clustering separat auf Matrixzeilen auszuführen, und als auf seinen Säulen, Neuordnungs die Daten in der Matrix, die die Clustering zu reflektieren und setzen sie alle zusammen. Das Clustering-Problem ist leicht lösbar, so ist die dendrogram Schöpfung (zum Beispiel in Blog oder in " Programmieren kollektive Intelligenz "). Jedoch, wie die Daten neu zu ordnen, bleibt unklar für mich.

Schließlich, ich suche nach einer Möglichkeit, von Graphen ähnlich den unter Verwendung von naivem Python (mit einem beliebigen „Standard“ Bibliothek wie numpy, matplotlib usw., aber ohne mit R oder andere externe Tool).


(Quelle: warwick. ac.uk )

Clarifications

Ich wurde gefragt, was ich von Neuordnungs gemeint. Wenn Daten in einer Matrix zuerst von Matrixzeilen cluster, dann durch ihre Spalten, kann jede Matrixzelle durch die Position in den beiden Dendrogramme identifiziert werden. Wenn Sie die Zeilen und die Spalten der ursprünglichen Matrix, so dass die Elemente neu anordnen, die nahe jeder zu einem anderen in den Dendrogramme sind sich nahe jeder zu einem anderen in der Matrix und dann Heatmap erzeugen, das Clustering der Daten kann für den Betrachter deutlich wird (wie in der Abbildung oben)

War es hilfreich?

Lösung

Sehen Sie mein letzte Antwort , unter teilweise kopiert, auf diese Frage im Zusammenhang .

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


(Quelle: stevetjoa.com )

Andere Tipps

Ich bin nicht sicher, vollständig verstehen, aber es scheint, dass Sie versuchen, zu re-Index jede Achse des Arrays basierend auf Sorten des dendrogram indicies. Ich denke, das wird davon ausgegangen, dass eine Vergleichslogik in jedem Zweig Abgrenzung ist. Ist dies der Fall, dann würde diese Arbeit (?):

>>> 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 und y_idxs sind die dendrogram indicies. a ist die unsortierten Matrix. xi und yi sind Ihre neue Zeile / Spalte Array indicies. a2 ist die sortierte Matrix während x_idxs2 und y_idxs2 ist der neue, sortierte Dendrogramm indicies. Dies setzt voraus, dass, wenn das Dendrogramm wurde geschaffen, dass eine Zweig 0 Spalte / Zeile immer vergleichsweise größer / kleiner ist als ein 1 Zweig.

Wenn Ihr y_idxs und x_idxs keine Listen sind aber numpy Arrays, dann könnten Sie np.argsort auf ähnliche Weise verwendet werden.

Ich weiß, das ist sehr spät, um das Spiel, aber ich habe ein Plotten Objekt basierend auf dem Code von der Post auf dieser Seite. Es ist auf pip registriert, so installieren Sie nur Anruf haben

pip install pydendroheatmap

Schauen Sie sich die GitHub-Seite des Projekts hier: https://github.com/themantalope/pydendroheatmap

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top