Jenks Natural Breaks funciona optimizando la bondad del ajuste de la varianza, un valor de 0 a 1 donde 0 = No hay ajuste y 1 = Ajuste perfecto. La clave en la selección del número de clases es encontrar un equilibrio entre la detección de diferencias y el sobreajuste de los datos. Para determinar el número óptimo de clases, le sugiero que utilice un valor umbral de GVF que desee y utilice el número de clases que satisfaga este valor primero.
A continuación se muestra una función para calcular la bondad del ajuste de la varianza dada una matriz de valores a clasificar y el número de clases seleccionadas:
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 ejemplo, considere que decide que el GVF debe ser al menos de 0,8, entonces podría incrementar el número de clases hasta que se satisfaga el GVF:
gvf = 0.0
nclasses = 2
while gvf < .8:
gvf = goodness_of_variance_fit(array, nclasses)
nclasses += 1
0 votos
Para que podamos determinar objetivamente lo que significa "mejor", ¿podría explicar en qué sentido las clases "coinciden" con los datos? (O, en realidad, cómo cuantificarías cualquier grado de desajuste).
0 votos
Usar Silhouette con Jenks debería ser comparable a usarlo con kmeans. Es una heurística y no hay que confiar ciegamente en ella. En mi opinión, lo mejor es visualizar sus resultados.
0 votos
Whuber: Lo mejor, utilizando Silhouette, significaría que el número de clases que hacen que el índice sea más cercano a 1, de acuerdo con la definición en el sitio sklearn: scikit-learn.org/stable/modules/generated/ Anony-Mousse: No puedo visualizar más de 20 variables, preparar mapas para ello y esperar que mi cerebro no se líe con el número de clases. Necesito apoyarme en un índice que diga "para la variable X, lo mejor que puedes hacer es usar Y clases". Además tengo que volver a ejecutar el análisis varias veces, el enfoque viz es lento por desgracia...
0 votos
From jenks import jenks: da el siguiente error Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: cannot import name jenks