पाइथन में जेनक नेचुरल ब्रेक्स: ब्रेक की इष्टतम संख्या कैसे पता करें?


17

मुझे जेनेक्स नैचुरल ब्रेक्स एल्गोरिथम का यह पायथन कार्यान्वयन मिला और मैं इसे अपने विंडोज 7 मशीन पर चला सकता हूं। यह बहुत तेज़ है और यह मेरे जियोडाटा के आकार को देखते हुए कुछ ही समय में टूट जाता है। अपने डेटा के लिए इस क्लस्टरिंग एल्गोरिथ्म का उपयोग करने से पहले, मैं (यहाँ) एल्गोरिथ्म का उपयोग कर रहा था । केमियंस के साथ मुझे जो समस्या थी, वह इष्टतम K मान पैरामीटर ढूंढ रहा था, लेकिन मैंने विभिन्न K मानों के लिए एल्गोरिथ्म लॉन्च किया और सबसे अच्छा K खोजने के लिए (यहां) का उपयोग किया।sklearn.clustering.KMeans sklearn.metrics.silhouette_score

मेरा प्रश्न यह है: यदि मैं 5 वर्ग (जो कि K होगा) खोजने के लिए नैचुरल ब्रेक्स एल्गोरिथम बताता हूं, तो मैं यह कैसे सुनिश्चित कर सकता हूं कि यह उन वर्गों की संख्या है जो मेरे डेटा से सबसे अधिक मेल खाते हैं? कैसे मान्य करें कि मैं सबसे अच्छी संख्या में ब्रेक चुन रहा हूं?

धन्यवाद!


ताकि हम उद्देश्यपूर्ण रूप से यह निर्धारित कर सकें कि "सर्वश्रेष्ठ" का क्या मतलब है, क्या आप उस समझ को बता सकते हैं जिसमें कक्षाएं "मैच" डेटा हैं? (या, वास्तव में, आप कैसे गलत मिलान के किसी भी डिग्री यों होगा।)
whuber

जेनेक्स के साथ सिल्हूट का उपयोग करना किमी के साथ इसका उपयोग करने के लिए तुलनीय होना चाहिए। यह एक हेयुरिस्टिक है और आपको इस पर आँख बंद करके भरोसा नहीं करना चाहिए। IMHO सबसे अच्छा है कि आप अपनी खामियों की कल्पना करें।
है क्विट - Anony-Mousse

Whuber: सर्वश्रेष्ठ, सिल्हूट का उपयोग करने का मतलब होगा कि स्केलेर साइट पर परिभाषा के अनुसार, अनुक्रमणिका को 1 के करीब बनाने वाली कक्षाओं की संख्या: scikit-learn.org/stable/modules/generated/… एनी-मूस: मैं कल्पना नहीं कर सकता 20+ चर, उसके लिए मानचित्र तैयार करें और उम्मीद करें कि मेरा मस्तिष्क कक्षाओं की संख्या के साथ खिलवाड़ नहीं करेगा। मुझे एक इंडेक्स पर भरोसा करने की ज़रूरत है जो कहता है, "वेरिएबल एक्स के लिए, सबसे अच्छा आप जो कर सकते हैं वह है वाई क्लास का उपयोग करना"। इसके अलावा मुझे कई बार विश्लेषण को फिर से चलाने की आवश्यकता है, अर्थात दृष्टिकोण दुर्भाग्य से धीमा है ...
iamgin

से आयात jenks jenks: निम्नलिखित त्रुटि देता है Traceback (सबसे हाल ही में कॉल अंतिम): फ़ाइल "<stdin>", पंक्ति 1, में <मॉड्यूल> ImportError: नाम jenks आयात नहीं कर सकते
user120982

जवाबों:


19

जेनकस नेचुरल ब्रेक्स वेरिएंट फिट की अच्छाई का अनुकूलन करके काम करता है, 0 से 1 तक का मान जहां 0 = नो फिट और 1 = परफेक्ट फिट। वर्गों की संख्या का चयन करने में महत्वपूर्ण अंतर का पता लगाने और आपके डेटा को ओवरफिट करने के बीच एक संतुलन खोजना है। कक्षाओं की अधिकतम संख्या निर्धारित करने के लिए, मेरा सुझाव है कि आप अपनी इच्छा के अनुसार थ्रेशोल्ड GVF मान का उपयोग करें और उन वर्गों की संख्या का उपयोग करें जो पहले इस मान को संतुष्ट करते हैं।

नीचे वर्गीकृत करने के लिए मानों की एक सरणी दिए गए वेरिएंट फ़िट की अच्छाई की गणना करने के लिए एक समारोह है और चयनित वर्गों की संख्या:

from jenks import jenks
import numpy as np
def goodness_of_variance_fit(array, classes):
    # get the break points
    classes = jenks(array, classes)

    # do the actual classification
    classified = np.array([classify(i, classes) for i in array])

    # max value of zones
    maxz = max(classified)

    # nested list of zone indices
    zone_indices = [[idx for idx, val in enumerate(classified) if zone + 1 == val] for zone in range(maxz)]

    # sum of squared deviations from array mean
    sdam = np.sum((array - array.mean()) ** 2)

    # sorted polygon stats
    array_sort = [np.array([array[index] for index in zone]) for zone in zone_indices]

    # sum of squared deviations of class means
    sdcm = sum([np.sum((classified - classified.mean()) ** 2) for classified in array_sort])

    # goodness of variance fit
    gvf = (sdam - sdcm) / sdam

    return gvf

def classify(value, breaks):
    for i in range(1, len(breaks)):
        if value < breaks[i]:
            return i
    return len(breaks) - 1

उदाहरण के लिए, विचार करें कि आप तय करते हैं कि GVF कम से कम .8 होना चाहिए, तब तक आप कक्षाओं की संख्या बढ़ा सकते हैं जब तक कि GVF संतुष्ट न हो जाए:

gvf = 0.0
nclasses = 2
while gvf < .8:
    gvf = goodness_of_variance_fit(array, nclasses)
    nclasses += 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.