PythonのJenks Natural Breaks:最適なブレーク数を見つける方法


16

私が見つかりました。このPython実装ジェンクス自然ブレークのアルゴリズムを、私はそれが私のWindows 7のマシン上で実行させることができます。それは非常に高速で、私のジオデータのサイズを考慮して、数時間で休憩を見つけます。データにこのクラスタリングアルゴリズムを使用する前に、sklearn.clustering.KMeans (ここで)アルゴリズムを使用していました。私がKMeansで抱えていた問題は、最適なK値パラメーターを見つけることでしたが、異なるK値のアルゴリズムを起動し、sklearn.metrics.silhouette_score (ここで)最適なK値を見つけるためにそれを「解決」しました。

私の質問は、Natural Breaksアルゴリズムに5つのクラス(Kとなる)を見つけるように指示した場合、これがデータに最適なクラスの数であることをどのように確認できますか?最適な数の休憩を選択していることを検証する方法は?

ありがとう!


「最良」の意味を客観的に判断できるように、クラスがデータに「一致」する意味を説明してください。(または、実際には、どの程度の
不一致

JenksでSilhouetteを使用することは、kmeansでSilhouetteを使用することに匹敵するはずです。これはヒューリスティックであり、盲目的に信頼するべきではありません。私見最高はあなたのrrsults を視覚化することです。
アノニムース-復元モニカ

Whuber:最高の、シルエットを使用すると、sklearnサイトの定義に従って、インデックスを1に近づけるクラスの数を意味します:scikit-learn.org/stable/modules/generated/…Anony-Mousse :視覚化できません20以上の変数、そのためのマップを準備し、私の脳がクラスの数を台無しにしないことを期待します。「変数Xの場合、できることはYクラスを使用することです」というインデックスに依存する必要があります。さらに、分析を数回再実行する必要があります
。viz

ジェンクスからジェンクスをインポートする:与え、次のエラートレースバック(最新の呼び出しの最後):ファイル「<STDIN>」、1行目を、で、<モジュール>はImportError:できないインポート名ジェンクス
user120982

回答:


18

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を少なくとも.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.