2016-08-01 28 views
10

Normalerweise, wenn ich Dendrogramme und Heatmaps mache, verwende ich eine Distanzmatrix und mache einen Haufen SciPy Zeug. Ich möchte Seaborn ausprobieren, aber Seaborn möchte meine Daten in rechteckiger Form (Zeilen = Proben, Spalten = Attribute, keine Abstandsmatrix)?Wie kann sns.clustermap eine vorberechnete Abstandsmatrix erhalten?

Ich möchte im Wesentlichen seaborn als Backend verwenden, um mein Dendrogramm zu berechnen und es auf meine Heatmap zu heften. Ist das möglich? Wenn nicht, kann dies ein Feature in der Zukunft sein.

Vielleicht gibt es Parameter, die ich einstellen kann, damit es eine Abstandsmatrix anstelle einer rechteckigen Matrix nehmen kann?

Hier ist die Nutzung:

seaborn.clustermap¶ 
seaborn.clustermap(data, pivot_kws=None, method='average', metric='euclidean', 
z_score=None, standard_scale=None, figsize=None, cbar_kws=None, row_cluster=True, 
col_cluster=True, row_linkage=None, col_linkage=None, row_colors=None, 
col_colors=None, mask=None, **kwargs) 

Mein Code unten:

from sklearn.datasets import load_iris 
iris = load_iris() 
X, y = iris.data, iris.target 
DF = pd.DataFrame(X, index = ["iris_%d" % (i) for i in range(X.shape[0])], columns = iris.feature_names) 

enter image description here

Ich glaube nicht meine Methode unten korrekt ist, weil ich gebe es eine vorberechnete Abstandsmatrix und NICHT eine rechteckige Datenmatrix, wie sie anfordert. Es gibt keine Beispiele für die Verwendung einer Korrelations-/Abstandsmatrix mit clustermap, aber es gibt https://stanford.edu/~mwaskom/software/seaborn/examples/network_correlations.html, aber die Reihenfolge ist nicht mit der einfachen sns.heatmap-Funktion gruppiert.

DF_corr = DF.T.corr() 
DF_dism = 1 - DF_corr 
sns.clustermap(DF_dism) 

enter image description here

+0

Ich bin mir nicht sicher, ob ich die Frage verstehe. Ist die zweite Matrix nicht quadratisch? – mwaskom

+0

Ja, die zweite ist definitiv quadratisch, aber es ist b/c Ich fütterte es eine Abstandsmatrix (1 - Korrelation), während "sns.cluster_map" die rechteckige Datenmatrix benötigt. Also im Grunde nahm es meine redundante Quadratdistanz-Matrix, behandelte sie als Rohwerte, und machte dann Verknüpfung daraus. Funktioniert das mathematisch? Es scheint nicht sinnvoll zu sein, da die Eingabe eine rechteckige Datenmatrix erfordert und ich denke, dass bestimmte Schritte wiederholt werden. –

+0

Ich denke, Sie müssen die Frage bearbeiten, um klarer zu machen, was Sie wissen möchten. Wie Sie geschrieben haben, fragen Sie, wie Sie eine quadratische Matrix erstellen, und Sie zeigen eine Darstellung, die eine quadratische Matrix ist. – mwaskom

Antwort

8

Sie können die vorberechneten Distanzmatrix als Bindung an clustermap() passieren:

import pandas as pd, seaborn as sns 
import scipy.spatial as sp, scipy.cluster.hierarchy as hc 
from sklearn.datasets import load_iris 
sns.set(font="monospace") 

iris = load_iris() 
X, y = iris.data, iris.target 
DF = pd.DataFrame(X, index = ["iris_%d" % (i) for i in range(X.shape[0])], columns = iris.feature_names) 

DF_corr = DF.T.corr() 
DF_dism = 1 - DF_corr # distance matrix 
linkage = hc.linkage(sp.distance.squareform(DF_dism), method='average') 
sns.clustermap(DF_dism, row_linkage=linkage, col_linkage=linkage) 

Für clustermap(distance_matrix) (dh ohne Gestänge geführt) wird die Verknüpfung intern berechnet auf paarweise Entfernungen der Zeilen und Spalten in der Abstandsmatrix (siehe Hinweis unten für alle Details), anstatt die Elemente der Abstandsmatrix direkt zu verwenden (die richtige Lösung). Als Ergebnis ist die Ausgabe etwas verschieden von der in der Frage: clustermap

Anmerkung: Wenn kein row_linkage zu clustermap() übergeben wird, wird die Zeile Gestänge intern bestimmt, indem jede Zeile einen „Punkt“ unter Berücksichtigung (Beobachtung) und Berechnen der paarweisen Abstände zwischen den Punkten. Das Zeilen-Dendrogramm spiegelt also Zeilenähnlichkeit wider. Analog für col_linkage, wobei jede Spalte als ein Punkt betrachtet wird. Diese Erklärung sollte wahrscheinlich zu der docs hinzugefügt werden. Hier wurde das erste Beispiel der Dokumentation so geändert, dass die interne Verknüpfungsberechnung explizit gemacht wird:

+0

Danke nochmal @Ulrich Stern das macht Sinn! –