2016-08-01 2 views
10

आमतौर पर जब मैं डेंडरोग्राम और हीटमैप्स करता हूं, तो मैं दूरी मैट्रिक्स का उपयोग करता हूं और SciPy सामान का एक गुच्छा करता हूं। मैं Seaborn को आजमा देना चाहता हूं लेकिन Seaborn आयताकार रूप में मेरा डेटा चाहता है (पंक्तियां = नमूने, कोल्स = विशेषताएँ, दूरी मैट्रिक्स नहीं)?sns.clustermap को एक प्रीकंप्यूटेड दूरी मैट्रिक्स कैसे देना है?

मैं अनिवार्य रूप से seaborn का उपयोग अपने डेंड्रोग्राम की गणना करने के लिए बैकएंड के रूप में करना चाहता हूं और इसे अपने हीटमैप पर ले जाना चाहता हूं। क्या यह संभव है? यदि नहीं, तो यह भविष्य में एक विशेषता हो सकती है।

शायद ऐसे पैरामीटर हैं जिन्हें मैं समायोजित कर सकता हूं ताकि यह एक आयताकार मैट्रिक्स के बजाय दूरी मैट्रिक्स ले सके?

यहाँ उपयोग है:

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) 

मेरे नीचे कोड:

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

मुझे नहीं लगता कि मेरी विधि नीचे सही है क्योंकि मैं इसे एक precomputed रहा हूं दूरी मैट्रिक्स और एक आयताकार डेटा मैट्रिक्स के रूप में अनुरोध नहीं है। clustermap के साथ सहसंबंध/दूरी मैट्रिक्स का उपयोग करने के लिए कोई उदाहरण नहीं है लेकिन https://stanford.edu/~mwaskom/software/seaborn/examples/network_correlations.html के लिए है लेकिन ऑर्डरिंग क्लस्टर नहीं है/सादा sns.heatmap func।

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

enter image description here

+0

मुझे यकीन नहीं है कि मैं प्रश्न समझता हूं। क्या दूसरा मैट्रिक्स वर्ग नहीं है? – mwaskom

+0

हाँ, दूसरा एक निश्चित रूप से वर्ग है लेकिन यह बी/सी है, मैंने इसे दूरी मैट्रिक्स (1-सहसंबंध) खिलाया जबकि 'sns.cluster_map' को आयताकार डेटा मैट्रिक्स की आवश्यकता होती है। तो मूल रूप से यह मेरे अनावश्यक वर्ग दूरी मैट्रिक्स ले लिया, उन्हें कच्चे मूल्य के रूप में माना, और फिर उस से जुड़ाव किया। क्या यह गणितीय रूप से काम करता है? यह समझ में नहीं आता है क्योंकि इनपुट को आयताकार डेटा मैट्रिक्स की आवश्यकता होती है और मुझे लगता है कि कुछ चरणों को दोहराया जा रहा है। –

+0

मुझे लगता है कि आपको यह स्पष्ट करने के लिए कि आप क्या जानना चाहते हैं, उसे संपादित करने की आवश्यकता है। जैसा कि लिखा गया है कि आप स्क्वायर मैट्रिक्स बनाने के लिए कह रहे हैं, और आप एक प्लॉट दिखा रहे हैं जो स्क्वायर मैट्रिक्स है। – mwaskom

उत्तर

8

आप clustermap() को कड़ी के रूप में precomputed दूरी मैट्रिक्स पारित कर सकते हैं:

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) 

clustermap(distance_matrix) (यानी, लिंकेज पारित कर के बिना) के लिए, लिंकेज आंतरिक जोड़ो में दूरी के आधार पर की गणना दूरस्थ मैट्रिक्स के सीधे (सही समाधान) के तत्वों का उपयोग करने के बजाय दूरी मैट्रिक्स में पंक्तियों और स्तंभों (पूर्ण विवरण के लिए नीचे नोट देखें)। clustermap

नोट: कोई row_linkageclustermap() के लिए पारित किया गया है, पंक्ति लिंकेज प्रत्येक पंक्ति एक "बिंदु" (अवलोकन) पर विचार द्वारा आंतरिक रूप से निर्धारित किया जाता है और इसके परिणामस्वरूप, उत्पादन सवाल में एक से कुछ अलग है अंक के बीच जोड़ी दूरी की गणना। तो पंक्ति डेंडरोग्राम पंक्ति समानता को दर्शाता है। col_linkage के लिए एनालॉगस, जहां प्रत्येक कॉलम को एक बिंदु माना जाता है। यह स्पष्टीकरण docs में जोड़ा जाना चाहिए। यहां दस्तावेज़ों का पहला उदाहरण आंतरिक लिंकेज गणना को स्पष्ट करने के लिए संशोधित किया गया है:

import seaborn as sns; sns.set() 
import scipy.spatial as sp, scipy.cluster.hierarchy as hc 
flights = sns.load_dataset("flights") 
flights = flights.pivot("month", "year", "passengers") 
row_linkage, col_linkage = (hc.linkage(sp.distance.pdist(x), method='average') 
    for x in (flights.values, flights.values.T)) 
g = sns.clustermap(flights, row_linkage=row_linkage, col_linkage=col_linkage) 
    # note: this produces the same plot as "sns.clustermap(flights)", where 
    # clustermap() calculates the row and column linkages internally 
+0

धन्यवाद फिर से @ उलच स्टर्न यह सही समझ में आता है! –

संबंधित मुद्दे