2010-03-16 13 views
24

मैं एक तरह से मैट्रिक्स पंक्तियों पर अलग से क्लस्टरिंग प्रदर्शन करने के लिए और उसके स्तंभों पर से, मैट्रिक्स में डेटा को पुन: व्यवस्थित क्लस्टरिंग को प्रतिबिंबित करने के लिए देख रहा हूँ और यह सब एक साथ डाल । क्लस्टरिंग समस्या आसानी से सुलभ है, इसलिए डेंडरोग्राम निर्माण (उदाहरण के लिए this blog या "Programming collective intelligence" में)। हालांकि, डेटा को पुन: व्यवस्थित करने के लिए मेरे लिए अस्पष्ट कैसे रहता है।पुनःअनुक्रमण मैट्रिक्स तत्वों naiive अजगर में स्तंभ और पंक्ति क्लस्टरिंग प्रतिबिंबित करने के लिए

आखिरकार, मैं बेवकूफ पायथन (किसी भी "मानक" लाइब्रेरी जैसे numpy, matplotlib आदि के साथ नीचे दिए गए ग्राफों को बनाने का एक तरीका ढूंढ रहा हूं, लेकिन using R या अन्य बाहरी टूल के बिना)।

dendogram http://www2.warwick.ac.uk/fac/sci/moac/currentstudents/peter_cock/r/heatmap/no_scaling.png

स्पष्टीकरण

मैंने पूछा था कि मैं क्या पुनर्व्यवस्था का मतलब। जब आप मैट्रिक्स पंक्तियों द्वारा पहले मैट्रिक्स में डेटा क्लस्टर करते हैं, तो उसके कॉलम द्वारा, प्रत्येक मैट्रिक्स सेल को दो डेंड्रोग्राम में स्थिति द्वारा पहचाना जा सकता है। यदि आप पंक्तियों और मूल मैट्रिक्स के कॉलम को पुन: व्यवस्थित करते हैं जैसे कि डेंडरोग्राम में प्रत्येक को बंद करने वाले तत्व मैट्रिक्स में प्रत्येक के करीब होते हैं, और फिर हीटमैप उत्पन्न करते हैं, तो डेटा का क्लस्टर दर्शक के लिए स्पष्ट हो सकता है (उपर्युक्त आंकड़े के रूप में)

+0

क्या आप पुन: क्रम देकर मतलब है: यह बहुत स्थापित करने के लिए आप सिर्फ

pip install pydendroheatmap 

जांच परियोजना की GitHub पेज यहां कॉल करनी होगी पिप पर पंजीकृत है या नहीं? एन पड़ोसी पंक्तियों/कोल्स को दूसरे एन के साथ बदलना? –

+0

आप निश्चित रूप से matrices से निपटने के दौरान numpy/scipy का उपयोग करना चाहते हैं। Matplotlib भी Matlab अच्छी तरह से नकल करता है। यहां एक सौदा है: यदि आप इसे मैटलैब में कर सकते हैं, तो आप इसे भी समझ सकते हैं (यदि कोई हो तो छोटा सिंटैक्स अंतर)। –

+1

ओह, सुंदर तस्वीर के लिए +1 ;-) –

उत्तर

36

मेरा recent answer देखें, नीचे दिए गए हिस्से में कॉपी किया गया है, this related question पर।

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

Dendrogram and distance matrix http://up.stevetjoa.com/dendrogram.png

+1

वाह, अच्छा समाधान। आप matplotlib को सीधे दिखते हैं, जो मुझे लगता है कि काफी कामयाब है। लेकिन फिर आप एक्स और वाई अक्षों में लेबल कैसे जोड़ते हैं? क्या आपको जुड़वां और जुड़वां उपयोग करने की ज़रूरत है, या क्या कोई है अधिक सरल तरीका। – conradlee

+1

धन्यवाद। मुझे matplotlib पसंद है और मैं इसका बहुत उपयोग करता हूं। iPython आपको matplotlib और pylab आगे का पता लगाने में मदद करता है। दूरी मैट्रिक्स (चित्रित केंद्र) के अक्षों में लेबल जोड़ने के लिए, आप 'set_xticks' का उपयोग कर सकते हैं और 'set_xticklabels'। http: // ma देखें tplotlib.sourceforge.net/api/axes_api.html?highlight=set_xticklabels#matplotlib.axes.Axes.set_xticklabels –

5

मुझे यकीन नहीं है कि पूरी तरह से समझ में आता है, लेकिन ऐसा लगता है कि आप डेंडरोग्राम इंडस्ट्रीज के प्रकार के आधार पर सरणी के प्रत्येक अक्ष को दोबारा अनुक्रमणित करने का प्रयास कर रहे हैं। मुझे लगता है कि मानता है कि प्रत्येक शाखा चित्रण में कुछ तुलनात्मक तर्क है। इस मामले है तो यह काम होगा (?):

>>> 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 और y_idxs dendrogram indicies हैं। a अपरिवर्तित मैट्रिक्स है। xi और yi आपकी नई पंक्ति/कॉलम सरणी इंडस्ट्रीज हैं। a2 क्रमबद्ध मैट्रिक्स है जबकि x_idxs2 और y_idxs2 नए, क्रमबद्ध डेंडरोग्राम इंडस्ट्रीज हैं। यह मानता है कि जब डेंडरोग्राम बनाया गया था कि 0 शाखा कॉलम/पंक्ति हमेशा 1 शाखा से तुलनात्मक रूप से बड़ी/छोटी होती है।

अपने y_idxs और x_idxs सूचियों नहीं हैं, लेकिन NumPy सरणी हैं, तो आप एक समान तरीके से np.argsort इस्तेमाल कर सकते हैं।

+0

"ज़िप (* क्रमबद्ध ..." में क्या करता है * –

+0

जब भी मैं 'ज़िप (*', मुझे लगता है "ट्रांसपोज़" दिखाई देता है। अनपॅकिंग के लिए '*' के उपयोग के लिए यहां देखें : http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists – Paul

+0

और यहां कुछ और चर्चा: http://stackoverflow.com/questions/19339/a-transpose-unzip-function-in -पीथॉन – Paul

2

मैं जानता हूँ कि इस खेल के लिए बहुत देर हो चुकी है, लेकिन मैं इस पृष्ठ पर पद से कोड के आधार पर एक साजिश रचने वस्तु बना दिया। https://github.com/themantalope/pydendroheatmap