Jenks Natural Breaks in Python: Wie finde ich die optimale Anzahl von Pausen?

16

Ich habe diese Python-Implementierung des Jenks Natural Breaks- Algorithmus gefunden und konnte sie auf meinem Windows 7-Computer ausführen. Es ist ziemlich schnell und es findet die Brüche in weniger Zeit, wenn man die Größe meiner Geodaten berücksichtigt. Bevor ich diesen Clustering-Algorithmus für meine Daten verwendete, verwendete ich sklearn.clustering.KMeans (hier) Algorithmus. Das Problem, das ich mit KMeans hatte, war das Finden des optimalen K-Wert-Parameters, aber ich "löste" es, indem ich den Algorithmus für verschiedene K-Werte startete und sklearn.metrics.silhouette_score (hier) verwendete , um das beste K zu finden.

Meine Frage lautet: Wenn ich dem Natural Breaks-Algorithmus vorschreibe, 5 Klassen zu finden (das wäre K), wie kann ich dann sicher sein, dass dies die Anzahl der Klassen ist, die meinen Daten am besten entsprechen? Wie bestätige ich, dass ich die beste Anzahl von Pausen wähle?

Vielen Dank!

iamgin
quelle
Können Sie erklären, inwieweit die Klassen mit den Daten "übereinstimmen", damit wir objektiv feststellen können, was "am besten" bedeutet? (Oder wirklich, wie Sie den Grad der
Nichtübereinstimmung
Die Verwendung von Silhouette mit Jenks sollte mit der Verwendung mit km vergleichbar sein. Es ist eine Heuristik und du solltest ihr nicht blind vertrauen. IMHO ist das Beste, um Ihre Ergebnisse zu visualisieren .
Anony-Mousse
Whuber: Am besten mit Silhouette, würde die Anzahl der Klassen bedeuten, die den Index näher an 1 bringen, gemäß der Definition auf der sklearn-Site: scikit-learn.org/stable/modules/generated/… Anony-Mousse: Ich kann nicht visualisieren 20+ Variablen, bereite Karten dafür vor und erwarte, dass mein Gehirn die Anzahl der Klassen nicht durcheinander bringt. Ich muss mich auf einen Index verlassen, der besagt: "Für Variable X können Sie am besten Y-Klassen verwenden". Außerdem muss ich die Analyse mehrmals wiederholen, der Ansatz ist leider langsam ...
iamgin
aus jenks importieren jenks: gibt folgenden Fehler zurückverfolgen (letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <Modul> ImportError: Name jenks
user120982

Antworten:

18

Jenks Natural Breaks optimiert die Anpassung der Varianzgüte, einen Wert von 0 bis 1, wobei 0 = Keine Anpassung und 1 = Perfekte Anpassung. Der Schlüssel zur Auswahl der Anzahl der Klassen besteht darin, ein Gleichgewicht zwischen dem Erkennen von Unterschieden und der Überanpassung Ihrer Daten zu finden. Um die optimale Anzahl von Klassen zu bestimmen, empfehle ich Ihnen, einen gewünschten Schwellen-GVF-Wert zu verwenden und die Anzahl von Klassen zu verwenden, die diesen Wert zuerst erfüllt.

Nachfolgend finden Sie eine Funktion zur Berechnung der Anpassung der Varianzgüte anhand einer Reihe von zu klassifizierenden Werten und der Anzahl der ausgewählten Klassen:

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

Angenommen, Sie entscheiden, dass der GVF mindestens 0,8 betragen soll, dann können Sie die Anzahl der Klassen erhöhen, bis der GVF erfüllt ist:

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