Matrixelemente Neuordnen zu Spalten- und Zeilen clustering in naiive Python widerspiegeln
-
20-09-2019 - |
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)
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