15

मुझे क्लस्टर की प्रीसेट संख्या में एक साधारण यूनिवर्सेट डेटा सेट क्लस्टर करने की आवश्यकता है। तकनीकी रूप से यह डेटा को कताई या सॉर्ट करने के करीब होगा क्योंकि यह केवल 1 डी है, लेकिन मेरा मालिक इसे क्लस्टरिंग कह रहा है, इसलिए मैं उस नाम से चिपकने जा रहा हूं। सिस्टम द्वारा उपयोग की जाने वाली वर्तमान विधि के-साधन है, लेकिन यह ओवरकिल की तरह लगता है।विज्ञान के सीखने में 1 डी क्लस्टरिंग विधि के रूप में कर्नेल घनत्व अनुमान का उपयोग कैसे किया जाएगा?

क्या यह कार्य करने का बेहतर तरीका है?

कुछ अन्य पोस्टों के उत्तर केडीई (कर्नेल घनत्व अनुमान) का उल्लेख कर रहे हैं, लेकिन यह घनत्व अनुमान विधि है, यह कैसे काम करेगा?

मैं देखता हूं कि केडीई घनत्व कैसे लौटाता है, लेकिन मैं इसे डेटा को डिब्बे में विभाजित करने के लिए कैसे कहूं?

मेरे पास डेटा से स्वतंत्र डिब्बे की एक निश्चित संख्या कैसे है (यह मेरी आवश्यकताओं में से एक है)?

अधिक विशेष रूप से, कोई भी विज्ञान सीखने का उपयोग करके इसे कैसे खींच सकता है?

मेरे इनपुट फ़ाइल की तरह दिखता है:

str ID  sls 
1   10 
2   11 
3   9 
4   23 
5   21 
6   11 
7   45 
8   20 
9   11 
10   12 

मैं समूह के लिए भी क्लस्टर या डिब्बे में एसएलएस संख्या चाहते हैं, जैसे कि:

Cluster 1: [10 11 9 11 11 12] 
Cluster 2: [23 21 20] 
Cluster 3: [45] 

और मेरी आउटपुट फ़ाइल तरह दिखेगा:

str ID  sls Cluster ID Cluster centroid 
    1  10  1    10.66 
    2  11  1    10.66 
    3   9  1    10.66 
    4  23  2    21.33 
    5  21  2    21.33 
    6  11  1    10.66 
    7  45  3    45 
    8  20  2    21.33 
    9  11  1    10.66 
    10  12  1    10.66 
+0

के-साधनों के साथ चिंता क्या है? प्रदर्शन? –

+0

kmeans kde – lejlot

+0

@ डेविडमास्ट 1 से अधिक कुशल है) जब मैंने यूनिवर्सेट डेटा पर sklearn के के-साधन चलाने की कोशिश की, तो मुझे त्रुटियां मिलनी शुरू हुईं। मुझे इसे 2 डी डेटा पर क्लस्टर करके इसे ट्रिक करना था जो मूल 1 डी डेटा की समान प्रतियां थीं। 2) इस [पोस्ट] के अनुसार (http://stackoverflow.com/a/11516590/3967806) यह एक बुरा विचार है। –

उत्तर

24

खुद को कोड लिखें। फिर यह आपकी समस्या को सबसे अच्छा फिट बैठता है!

बॉयलरप्लेट: कभी भी नेट से डाउनलोड करने वाले कोड को सही या इष्टतम होने के लिए न मानें ... इसका उपयोग करने से पहले इसे पूरी तरह से समझना सुनिश्चित करें।

plot(s[:mi[0]+1], e[:mi[0]+1], 'r', 
    s[mi[0]:mi[1]+1], e[mi[0]:mi[1]+1], 'g', 
    s[mi[1]:], e[mi[1]:], 'b', 
    s[ma], e[ma], 'go', 
    s[mi], e[mi], 'ro') 

:

%matplotlib inline 

from numpy import array, linspace 
from sklearn.neighbors.kde import KernelDensity 
from matplotlib.pyplot import plot 

a = array([10,11,9,23,21,11,45,20,11,12]).reshape(-1, 1) 
kde = KernelDensity(kernel='gaussian', bandwidth=3).fit(a) 
s = linspace(0,50) 
e = kde.score_samples(s.reshape(-1,1)) 
plot(s, e) 

enter image description here

from scipy.signal import argrelextrema 
mi, ma = argrelextrema(e, np.less)[0], argrelextrema(e, np.greater)[0] 
print "Minima:", s[mi] 
print "Maxima:", s[ma] 
> Minima: [ 17.34693878 33.67346939] 
> Maxima: [ 10.20408163 21.42857143 44.89795918] 

आपका समूहों इसलिए

print a[a < mi[0]], a[(a >= mi[0]) * (a <= mi[1])], a[a >= mi[1]] 
> [10 11 9 11 11 12] [23 21 20] [45] 

और नेत्रहीन, हम इस विभाजन किया हैं 210

हम लाल मार्करों में कटौती करते हैं। क्लस्टर केंद्रों के लिए हरे रंग के मार्कर हमारे सर्वोत्तम अनुमान हैं।

+0

मैं इस विधि को के-साधनों से बेहतर कॉल करने में संकोच करता हूं। इसमें एक मनमानी बैंडविड्थ का चयन करना और फिर 50 घनत्व अनुमानों की गणना करना शामिल है। ऐसा कहा जा रहा है, मुझे नहीं पता कि कर्नेल घनत्व अनुमान के साथ ऐसा करने का एक बेहतर तरीका है या नहीं। –

+4

आपको के बारे में पता नहीं है। आप न केवल बेहतर केंद्र (आउटलाइर्स से कम प्रभावित) प्राप्त करते हैं बल्कि * ध्वनि * विभाजन बिंदु (न केवल आधे रास्ते पर) प्राप्त करते हैं। बैंडविड्थ जैसे सिल्वरमैन के शासन पर बहुत सारे साहित्य हैं। इसके अलावा। 50 घनत्व अनुमानों की गणना करने की परवाह कौन करता है? आप कर्नेल को प्रीकंप्यूट कर सकते हैं और इसे तेजी से संकल्प में कर सकते हैं। –

+0

मैं यह भी जोड़ूंगा कि यह 1 डी क्लस्टरिंग के लिए एक विशेष रूप से तेज़, गैर-रैखिक स्केलिंग विधि है। – Matthew

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