Quebras naturais de Jenks em Python: como encontrar o número ideal de pausas?

17

Eu encontrei esta implementação em Python do algoritmo Jenks Natural Breaks e poderia fazê-lo rodar na minha máquina Windows 7. É bem rápido e encontra as quebras em pouco tempo, considerando o tamanho dos meus dados geográficos. Antes de usar esse algoritmo de clustering para meus dados, eu estava usando o algoritmo sklearn.clustering.KMeans (aqui) . O problema que tive com o KMeans foi encontrar o parâmetro ideal do valor K, mas "resolvi" iniciando o algoritmo para diferentes valores K e usando sklearn.metrics.silhouette_score (aqui) para encontrar o melhor K.

Minha pergunta é: se eu disser ao algoritmo Natural Breaks para encontrar 5 classes (que seria o K), como posso ter certeza de que esse é o número de classes que melhor corresponde aos meus dados? Como validar que estou escolhendo o melhor número de pausas?

Obrigado!

iamgin
fonte
Para que possamos determinar objetivamente o que "melhor" significa, você poderia explicar o sentido em que as classes "correspondem" aos dados? (Ou, realmente, como você quantificaria qualquer grau de
incompatibilidade
O uso do Silhouette com Jenks deve ser comparável ao uso com kmeans. É uma heurística e você não deve confiar cegamente. IMHO o melhor é visualizar seus resultados.
Anony-Mousse - Reponha Monica em 30/03
Whuber: Melhor, usando Silhouette, significaria o número de classes que tornam o índice mais próximo de 1, de acordo com a definição no site sklearn : scikit-learn.org/stable/modules/generated/… Anony-Mousse: não consigo visualizar Mais de 20 variáveis, preparo mapas para isso e espero que meu cérebro não mexa com o número de aulas. Eu preciso confiar em um índice que diz "para a variável X, o melhor que você pode fazer é usar as classes Y". Além disso eu preciso para executar re-os de análise várias vezes, a abordagem viz é lento, infelizmente ...
iamgin
de jenks importar jenks: dá seguinte erro Traceback (chamada mais recente passada): File "<stdin>", linha 1, na <module> ImportError: pode jenks nome não importação
user120982

Respostas:

19

O Jenks Natural Breaks funciona otimizando o ajuste de qualidade de variação, um valor de 0 a 1 em que 0 = sem ajuste e 1 = ajuste perfeito. A chave na seleção do número de classes é encontrar um equilíbrio entre a detecção de diferenças e a super adequação dos dados. Para determinar o número ideal de classes, sugiro que você use um valor limite de GVF desejado e use o número de classes que satisfaz esse valor primeiro.

Abaixo está uma função para calcular o Ajuste de Variação, dada uma matriz de valores a serem classificados e o número de classes selecionadas:

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

Por exemplo, considere que você decide que o GVF deve ter pelo menos 0,8 e, em seguida, você pode aumentar o número de classes até que o GVF seja satisfeito:

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