Jenks Natural Breaks ใน Python: จะหาจำนวนการพักที่เหมาะสมได้อย่างไร


17

ฉันพบการใช้ PythonของอัลกอริทึมJenks Natural Breaksและฉันสามารถทำให้มันทำงานบนเครื่อง Windows 7 ของฉัน มันค่อนข้างเร็วและพบว่าตัวแบ่งในเวลาไม่กี่พิจารณาขนาดของ geodata ของฉัน ก่อนที่จะใช้อัลกอริทึมการจัดกลุ่มนี้สำหรับข้อมูลของฉันฉันใช้อัลกอริทึมsklearn.clustering.KMeans (ที่นี่) ปัญหาที่ฉันมีกับ KMeans คือการหาพารามิเตอร์ค่า K ที่เหมาะสม แต่ฉัน "แก้ไข" มันเปิดตัวอัลกอริทึมสำหรับค่า K ที่แตกต่างกันและการใช้sklearn.metrics.silhouette_score (ที่นี่)เพื่อค้นหาเคที่ดีที่สุด

คำถามของฉันคือ: ถ้าฉันบอกอัลกอริธึมการแบ่งธรรมชาติเพื่อค้นหา 5 คลาส (นั่นคือ K) ฉันจะแน่ใจได้อย่างไรว่านี่เป็นจำนวนคลาสที่ตรงกับข้อมูลของฉันมากที่สุด ฉันจะตรวจสอบว่าฉันเลือกจำนวนการหยุดพักที่ดีที่สุดได้อย่างไร

ขอบคุณ!


เพื่อให้เราสามารถกำหนดความหมายของคำว่า "ดีที่สุด" ได้คุณสามารถอธิบายความหมายของข้อมูลที่ "จับคู่" ของคลาสได้หรือไม่ (หรือจริงๆวิธีที่คุณจะวัดปริมาณระดับของความผิดพลาดใด ๆ ที่ตรงกัน.)
whuber

การใช้ Silhouette กับ Jenks ควรเปรียบเทียบกับการใช้กับ kmeans มันเป็นฮิวริสติกและคุณไม่ควรเชื่อถือมันแบบสุ่ม IMHO ที่ดีที่สุดคือการเห็นภาพ rrsults ของคุณ
จบการทำงาน - Anony-Mousse

Whuber: ดีที่สุดการใช้ Silhouette หมายถึงจำนวนคลาสที่ทำให้ดัชนีใกล้เคียงกับ 1 ตามคำจำกัดความของไซต์sklearn : scikit-learn.org/stable/modules/generated/… Anony-Mousse: ฉันไม่สามารถมองเห็นภาพได้ 20+ ตัวแปรเตรียมแผนที่สำหรับสิ่งนั้นและคาดหวังว่าสมองของฉันจะไม่สับสนกับจำนวนชั้นเรียน ฉันต้องพึ่งพาดัชนีที่ระบุว่า "สำหรับตัวแปร X สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือใช้คลาส Y" ยิ่งไปกว่านั้นฉันจำเป็นต้องทำการวิเคราะห์ซ้ำหลายครั้งวิธีการกล่าวคือช้าน่าเสียดาย ...
iamgin

จาก jenks import jenks: ให้ข้อผิดพลาดต่อไปนี้ Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "<stdin>", บรรทัดที่ 1, ใน <module> ImportError: ไม่สามารถนำเข้าชื่อ jenks
user120982

คำตอบ:


19

Jenks Natural Breaks ทำงานโดยการปรับความดีของ Variance Fit ให้มีค่าตั้งแต่ 0 ถึง 1 โดยที่ 0 = ไม่พอดีและ 1 = Perfect Fit กุญแจสำคัญในการเลือกจำนวนชั้นเรียนคือการหาสมดุลระหว่างการตรวจจับความแตกต่างและ overfitting ข้อมูลของคุณ ในการกำหนดจำนวนคลาสที่เหมาะสมฉันขอแนะนำให้คุณใช้ค่า 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.