Python

Python 中的 Jenks Natural Breaks:如何找到最佳的休息次數?

  • March 29, 2015

我找到了Jenks Natural Breaks算法的Python 實現,我可以讓它在我的 Windows 7 機器上運行。考慮到我的地理數據的大小,它的速度非常快,並且可以在很短的時間內找到中斷。在對我的數據使用此聚類算法之前,我使用的是(此處)算法。我在使用 KMeans 時遇到的問題是找到最佳 K 值參數,但我“解決了”它針對不同 K 值啟動算法並使用(此處)找到最佳 K。sklearn.clustering.KMeans sklearn.metrics.silhouette_score

我的問題是:如果我告訴 Natural Breaks 算法找到 5 個類(即 K),我如何確定這是與我的數據最匹配的類數?如何驗證我選擇了最佳休息次數?

謝謝!

Jenks Natural Breaks 通過優化方差擬合優度來工作,該值介於 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 至少應為 0.8,那麼您可以增加類的數量直到 GVF 得到滿足:

gvf = 0.0
nclasses = 2
while gvf < .8:
   gvf = goodness_of_variance_fit(array, nclasses)
   nclasses += 1

引用自:https://stats.stackexchange.com/questions/143974

comments powered by Disqus