12

मैं क्लस्टर बनाने के लिए seaborn clustermap का उपयोग कर रहा हूं और दृष्टि से यह बहुत अच्छा काम करता है (यह example बहुत समान परिणाम उत्पन्न करता है)।seaborn clustermap से क्लस्टर निकालने

हालांकि मैं पता लगाना प्रोग्राम समूहों को निकालने के लिए परेशानी हो रही हूँ। उदाहरण के लिए, उदाहरण के लिंक में कैसे लगाया कि 1-1 rh, 1-1 lh, 5-1 rh, 5-1 खोजने के lh एक अच्छा क्लस्टर बना सकता है? दृश्यमान यह आसान है।

import pandas as pd 
import seaborn as sns 
sns.set(font="monospace") 

df = sns.load_dataset("brain_networks", header=[0, 1, 2], index_col=0) 
used_networks = [1, 5, 6, 7, 8, 11, 12, 13, 16, 17] 
used_columns = (df.columns.get_level_values("network") 
          .astype(int) 
          .isin(used_networks)) 
df = df.loc[:, used_columns] 

network_pal = sns.cubehelix_palette(len(used_networks), 
            light=.9, dark=.1, reverse=True, 
            start=1, rot=-2) 
network_lut = dict(zip(map(str, used_networks), network_pal)) 

networks = df.columns.get_level_values("network") 
network_colors = pd.Series(networks).map(network_lut) 

cmap = sns.diverging_palette(h_neg=210, h_pos=350, s=90, l=30, as_cmap=True) 

result = sns.clustermap(df.corr(), row_colors=network_colors, method="average", 
       col_colors=network_colors, figsize=(13, 13), cmap=cmap) 

मैं कैसे खींच सकते हैं मॉडल क्या है, जिसमें बाहर समूह जिनमें: मैं डेटा के माध्यम से देख के तरीकों, और dendrograms उपयोग करने के लिए कोशिश कर रहा हूँ, लेकिन मैं थोड़ी सफलता हो रही है उदाहरण से

संपादित कोड result का?

EDIT2resultdendrogram_col जो मुझे लगता है fcluster साथ काम करेगा साथ में यह एक linkage साथ ले जाने के लिए है। लेकिन चयन करने के लिए दहलीज मूल्य मुझे भ्रमित कर रहा है। मुझे लगता है कि थ्रेसहोल्ड से अधिक गर्मी के मूल्य में एक साथ क्लस्टर हो जाएगा?

उत्तर

10

result.linkage.dendrogram_col या result.linkage.dendrogram_row का उपयोग करते समय वर्तमान में काम करेगा, यह एक कार्यान्वयन विस्तार प्रतीत होता है। सबसे सुरक्षित मार्ग पहले संबंधों को स्पष्ट रूप से गणना और उन्हें clustermap समारोह है, जो सिर्फ इतना है कि के लिए row_linkage और col_linkage पैरामीटर को पारित करने के लिए है।

निम्न कोड के साथ अपने उदाहरण (result = ...) में अंतिम पंक्ति की जगह पहले की तरह ही परिणाम देता है, लेकिन आप यह भी row_linkage और col_linkage चर है कि आप fcluster आदि के साथ उपयोग कर सकते हैं

from scipy.spatial import distance 
from scipy.cluster import hierarchy 

correlations = df.corr() 
correlations_array = np.asarray(df.corr()) 

row_linkage = hierarchy.linkage(
    distance.pdist(correlations_array), method='average') 

col_linkage = hierarchy.linkage(
    distance.pdist(correlations_array.T), method='average') 

sns.clustermap(correlations, row_linkage=row_linkage, col_linkage=col_linkage, row_colors=network_colors, method="average", 
       col_colors=network_colors, figsize=(13, 13), cmap=cmap) 

इस विशेष उदाहरण में, कोड को सरलीकृत किया जा सकता है क्योंकि सहसंबंध सरणी सममित है और इसलिए row_linkage और col_linkage समान होंगे।

नोट: पिछले जवाब क्या Seaborn में कोड करता है के अनुसार distance.squareshape के लिए एक कॉल शामिल है, लेकिन है कि is a bug

+0

अरे @Marcel एम, नहीं आप एक "विषमताओं मैट्रिक्स 'के बजाय एक संबंध मैट्रिक्स का उपयोग करना चाहते हैं? '1 - एनपी.एब्स (सहसंबंध) 'या कुछ की तरह? –

+1

@ ओ.र्का 'sns.clustermap() 'से सहसंबंधों को पास करने के सवाल में उद्धृत समुद्री उदाहरण से आता है, जिसे मैंने अभी कॉपी किया है। दोनों संस्करण सहसंबंधों के बीच दूरी की गणना करते हैं, इसलिए अंत दूरी में वास्तव में उपयोग किया जाता है, लेकिन मैं मानता हूं कि मुझे नहीं पता कि यह कितना समझ में आता है (मुझे नहीं पता कि समुद्र का उदाहरण ऐसा क्यों करता है)। अपनी परियोजना में, मैं सीधे दूरी का उपयोग करता हूं। –

3

आप शायद क्लस्टर सदस्यता के साथ अपने dataframe में एक नया स्तंभ चाहते हैं। मैं वेब पर से चोरी कोड की इकट्ठे के टुकड़े से यह करने के लिए प्रबंधित किया है:

import seaborn 
import scipy 

g = seaborn.clustermap(df,method='average') 
den = scipy.cluster.hierarchy.dendrogram(g.dendrogram_col.linkage, 
             labels = df.index, 
             color_threshold=0.60) 
from collections import defaultdict 

def get_cluster_classes(den, label='ivl'): 
    cluster_idxs = defaultdict(list) 
    for c, pi in zip(den['color_list'], den['icoord']): 
     for leg in pi[1:3]: 
      i = (leg - 5.0)/10.0 
      if abs(i - int(i)) < 1e-5: 
       cluster_idxs[c].append(int(i)) 

    cluster_classes = {} 
    for c, l in cluster_idxs.items(): 
     i_l = [den[label][i] for i in l] 
     cluster_classes[c] = i_l 

    return cluster_classes 

clusters = get_cluster_classes(den) 

cluster = [] 
for i in df.index: 
    included=False 
    for j in clusters.keys(): 
     if i in clusters[j]: 
      cluster.append(j) 
      included=True 
    if not included: 
     cluster.append(None) 

df["cluster"] = cluster 

तो यह आप 'जी' या हरे या लाल लेबल समूहों के लिए 'आर' के साथ एक स्तंभ देता है। मैं dendrogram की साजिश रचने, और y- अक्ष मूल्यों eyeballing द्वारा मेरी color_threshold निर्धारण करते हैं।

+0

यह बड़े डेटा पर काम नहीं करेगा, जहां से रंगों से अधिक समूह हैं (उदाहरण के लिए) हरा खुद को दोहराएगा यह समूह रंग होगा। – PvdL