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