2016-04-12 11 views
5

में क्लस्टरिंग और दूरी की गणना मेरे पास फॉर्म (एक्स, वाई, जेड) के एन समन्वय बिंदुओं का संग्रह है। ये एक एन एक्स 3 मैट्रिक्स एमजूलिया

में संग्रहीत हैं क्या जूलिया में प्रत्येक बिंदु और हर दूसरे बिंदु के बीच की दूरी की गणना करने के लिए कोई अंतर्निहित कार्य है? मैं अंक की एक छोटी संख्या के साथ काम कर रहा हूं इसलिए गणना समय बहुत महत्वपूर्ण नहीं है।

मेरा समग्र लक्ष्य क्लस्टरिंग एल्गोरिदम चलाने के लिए है, इसलिए अगर क्लस्टरिंग एल्गोरिदम है तो मैं देख सकता हूं कि मुझे पहले इन दूरीों की गणना करने की आवश्यकता नहीं है, कृपया इसे भी सुझाव दें। जिस डेटा पर मैं क्लस्टरिंग करना चाहता हूं उसका एक उदाहरण नीचे दिया गया है। जाहिर है, मुझे केवल z समन्वय के लिए ऐसा करने की आवश्यकता होगी।

Example of data set I need to perform clustering on

+0

कई अलग अलग क्लस्टरिंग एल्गोरिदम रहे हैं। आप किस तरह का क्लस्टरिंग करना चाहते हैं? – niczky12

+0

मेरे पास एक डेटा सेट है जो दो अलग लटकते बिजली के केबल्स (x, y, z) निर्देशांक प्रदान करता है। वे केवल z अक्ष (ऊंचाई) के साथ भिन्न होते हैं। इस प्रकार मैं जेड निर्देशांक के आधार पर क्लस्टर करना चाहता हूं। हालांकि क्लस्टर जो क्लस्टर्स को काटने के लिए सीधी रेखा का उपयोग करता है, काम नहीं करता है क्योंकि ऊपरी कैटेनरी के निम्नतम बिंदु निचले कैटेनरी के उच्चतम बिंदु से कम हो सकते हैं। मैं वर्तमान में कैटेनरी को छोटे टुकड़ों में विभाजित कर रहा हूं जहां सीधी रेखा प्रकार क्लस्टरिंग काम करता है लेकिन यह एक बहुत साफ समाधान नहीं है। – lara

उत्तर

7

गणना करने के लिए दूरी Distancespackage का उपयोग करें।

मैट्रिक्स X को देखते हुए आप कॉलम के बीच जोड़ी दूरी की गणना कर सकते हैं। इसका मतलब है कि आपको मैट्रिक्स के कॉलम होने के लिए अपने इनपुट पॉइंट्स (अपनी एन ऑब्जेक्ट्स) की आपूर्ति करनी चाहिए। (अपने प्रश्न में आप NX3 मैट्रिक्स उल्लेख है, तो आप transpose() समारोह के साथ इस स्थानांतरित करने के लिए होगा।)

इसका इस्तेमाल करने के बारे में एक उदाहरण है:

>using Distances # install with Pkg.add("Distances") 

>x = rand(3,2) 

3x2 Array{Float64,2}: 
0.27436 0.589142 
0.234363 0.728687 
0.265896 0.455243 

>pairwise(Euclidean(), x, x) 

2x2 Array{Float64,2}: 
0.0  0.615871 
0.615871 0.0  

आप ऊपर रिटर्न देख सकते हैं X के कॉलम के बीच दूरी मैट्रिक्स। यदि आपको आवश्यकता हो तो आप अन्य दूरी मीट्रिक का उपयोग कर सकते हैं, बस पैकेज के लिए दस्तावेज़ों की जांच करें।

+0

धन्यवाद। अब जब मैं इसे अधिक डेटा के साथ किसी अन्य समस्या पर आज़माता हूं, तो मुझे स्मृति त्रुटि से बाहर निकलता है। किसी भी विचार से डेटा के विशाल सेट पर दूरी मैट्रिक्स की गणना कैसे की जा सकती है? – lara

5

बस @ niczky12 उत्तर की पूर्णता के लिए, जूलिया में एक पैकेज है जिसे Clustering कहा जाता है, जो अनिवार्य रूप से, जैसा कि नाम कहता है, आपको क्लस्टरिंग करने की अनुमति देता है।

एक नमूना kmeans एल्गोरिथ्म:

>>> using Clustering   # Pkg.add("Clustering") if not installed 

>>> X = rand(3, 100)   # data, each column is a sample 
>>> k = 10     # number of clusters 

>>> r = kmeans(X, k) 
>>> fieldnames(r) 
8-element Array{Symbol,1}: 
:centers  
:assignments 
:costs  
:counts  
:cweights 
:totalcost 
:iterations 
:converged 

परिणाम kmeans (r) जो ऊपर फ़ील्ड हैं की वापसी में संग्रहित है। दो शायद सबसे दिलचस्प फ़ील्ड: r.centers में केमैन एल्गोरिदम द्वारा पता लगाए गए केंद्र और r.assigments में क्लस्टर शामिल है जिसमें से प्रत्येक 100 नमूने संबंधित हैं।

एक ही पैकेज में कई अन्य क्लस्टरिंग विधियां हैं। प्रलेखन में गोता लगाने के लिए स्वतंत्र महसूस करें और अपनी आवश्यकताओं के अनुरूप सर्वोत्तम रूप से लागू करें।


आपके मामले में, के रूप में अपने डेटा एक N x 3 मैट्रिक्स है आप केवल यह स्थानांतरित करने के लिए की जरूरत है:

M = rand(100, 3) 
kmeans(M', k)