Jenks Natural Breaks trong Python: Làm thế nào để tìm ra số lần nghỉ tối ưu?


16

Tôi thấy điều này thực hiện Python của Breaks Jenks tự nhiên thuật toán và tôi có thể làm cho nó chạy trên máy tính Windows 7 của tôi. Nó là khá nhanh và nó tìm thấy sự phá vỡ trong vài thời gian, xem xét kích thước của geodata của tôi. Trước khi sử dụng thuật toán phân cụm này cho dữ liệu của tôi, tôi đã sử dụng thuật toán sklearn.clustering.KMeans (ở đây) . Vấn đề tôi gặp phải với KMeans, là tìm tham số giá trị K tối ưu, nhưng tôi đã "giải quyết" nó khởi chạy thuật toán cho các giá trị K khác nhau và sử dụng sklearn.metrics.silhouette_score (tại đây) để tìm ra giá trị K tốt nhất.

Câu hỏi của tôi là: nếu tôi nói thuật toán Natural Breaks tìm 5 lớp (đó sẽ là K), làm sao tôi có thể chắc chắn rằng đây là số lớp phù hợp nhất với dữ liệu của tôi? Làm thế nào để xác nhận rằng tôi đang chọn số lần nghỉ tốt nhất?

Cảm ơn!


Để chúng ta có thể xác định một cách khách quan ý nghĩa của "tốt nhất", bạn có thể giải thích ý nghĩa của các lớp "khớp" dữ liệu không? (Hoặc, thực sự, làm thế nào bạn sẽ định lượng bất kỳ mức độ khớp sai nào.)
whuber

Sử dụng Silhouette với Jenks nên tương đương với việc sử dụng nó với kmeans. Đó là một heuristic và bạn không nên tin tưởng nó một cách mù quáng. IMHO tốt nhất là để hình dung sự sai lầm của bạn.
Anony-Mousse -Reinstate Monica

Whuber: Tốt nhất, sử dụng Silhouette, có nghĩa là số lớp làm cho chỉ số gần với 1 hơn, theo định nghĩa trên trang web sklearn : scikit-learn.org/ sóng / modules / generic / điều Anony-Mousse: Tôi không thể hình dung được Hơn 20 biến số, chuẩn bị bản đồ cho điều đó và mong bộ não của tôi không bị rối với số lượng lớp học. Tôi cần dựa vào một chỉ số có nội dung: "đối với biến X, cách tốt nhất bạn có thể làm là sử dụng các lớp Y". Hơn nữa, tôi cần phải chạy lại phân tích nhiều lần, cách tiếp cận viz rất chậm ...
iamgin 30/03/2015

từ jenks nhập jenks: cho lỗi sau Traceback (nhất gần đây cuộc gọi cuối cùng): File "<stdin>", dòng 1, trong <module> ImportError: có thể tên jenks không nhập khẩu
user120982

Câu trả lời:


18

Jenks Natural Breaks hoạt động bằng cách tối ưu hóa Độ tốt của Variance Fit, giá trị từ 0 đến 1 trong đó 0 = Không phù hợp và 1 = Hoàn toàn phù hợp. Chìa khóa trong việc chọn số lượng các lớp là tìm sự cân bằng giữa việc phát hiện sự khác biệt và quá mức dữ liệu của bạn. Để xác định số lượng lớp tối ưu, tôi khuyên bạn nên sử dụng giá trị GVF ngưỡng mà bạn mong muốn và sử dụng số lượng lớp thỏa mãn giá trị này trước tiên.

Dưới đây là một hàm để tính Độ tốt của Phương sai Phù hợp với một mảng các giá trị để phân loại và số lượng các lớp được chọn:

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

Ví dụ, xem xét bạn quyết định GVF nên có ít nhất .8, sau đó bạn có thể tăng số lượng lớp cho đến khi GVF hài lòng:

gvf = 0.0
nclasses = 2
while gvf < .8:
    gvf = goodness_of_variance_fit(array, nclasses)
    nclasses += 1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.