Jenks Natural Breaks in Python: come trovare il numero ottimale di pause?


17

Ho trovato questa implementazione di Python del Breaks Jenks naturale algoritmo e ho potuto farlo funzionare sulla mia macchina Windows 7. È abbastanza veloce e trova le pause in poco tempo, considerando le dimensioni dei miei geodati. Prima di utilizzare questo algoritmo di clustering per i miei dati, stavo usando l' algoritmo sklearn.clustering.KMeans (qui) . Il problema che ho avuto con KMeans è stato trovare il parametro del valore K ottimale, ma l'ho "risolto" avviando l'algoritmo per diversi valori K e usando sklearn.metrics.silhouette_score (qui) per trovare il K. migliore

La mia domanda è: se dico all'algoritmo Natural Breaks di trovare 5 classi (che sarebbe la K), come posso essere sicuro che questo sia il numero di classi che meglio corrisponde ai miei dati? Come convalidare che sto scegliendo il miglior numero di pause?

Grazie!


Affinché possiamo determinare oggettivamente cosa significa "migliore", potresti spiegare il senso in cui le classi "corrispondono" ai dati? (O, davvero, come quantificheresti qualsiasi grado di errata corrispondenza.)
whuber

L'uso di Silhouette con Jenks dovrebbe essere paragonabile all'utilizzo con kmean. È euristico e non dovresti fidarti ciecamente. IMHO il migliore è visualizzare i tuoi risultati.
Anony-Mousse - Restituisci Monica il

Whuber: Meglio, usando Silhouette, significherebbe che il numero di classi che rendono l'indice più vicino a 1, secondo la definizione sul sito sklearn : scikit-learn.org/stable/modules/generated/… Anony-Mousse: non riesco a visualizzare Più di 20 variabili, prepara le mappe per questo e mi aspetto che il mio cervello non incasini il numero di lezioni. Devo fare affidamento su un indice che dice "per la variabile X, il meglio che puoi fare è usare le classi Y". Inoltre, ho bisogno di ripetere l'analisi più volte, purtroppo l'approccio è lento ...
iamgin

da jenks import jenks: restituisce il seguente errore Traceback (ultima chiamata più recente): File "<stdin>", riga 1, in <modulo> ImportError: impossibile importare jenks nome
user120982

Risposte:


19

Jenks Natural Breaks funziona ottimizzando la bontà della varianza adatta, un valore compreso tra 0 e 1 dove 0 = nessuna misura e 1 = perfetta. La chiave per selezionare il numero di classi è trovare un equilibrio tra il rilevamento delle differenze e il sovradimensionamento dei dati. Per determinare il numero ottimale di classi, ti suggerisco di utilizzare un valore GVF di soglia desiderato e di utilizzare il numero di classi che soddisfa prima questo valore.

Di seguito è una funzione per calcolare l'adattamento della bontà della varianza dato un array di valori da classificare e il numero di classi selezionate:

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

Ad esempio, considera di decidere che GVF dovrebbe essere almeno .8, quindi puoi aumentare il numero di classi fino a quando GVF è soddisfatto:

gvf = 0.0
nclasses = 2
while gvf < .8:
    gvf = goodness_of_variance_fit(array, nclasses)
    nclasses += 1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.