scikit learn - medoids - Cómo escalar DBSCAN de entrada en scikit-learn
k medoids sklearn (1)
Depende de lo que estés tratando de hacer.
Si ejecuta DBSCAN en datos geográficos, y las distancias están expresadas en metros, probablemente no quiera normalizar nada, pero establezca su umbral épsilon en metros, también.
Y sí, en particular, una escala no uniforme sí distorsiona las distancias. Mientras que una escala sin distorsión es equivalente a simplemente usar un valor diferente de épsilon.
Tenga en cuenta que en el primer ejemplo, aparentemente se procesa una similitud y no una matriz de distancia . S = (1 - D / np.max(D))
es una heurística para convertir una matriz de similitud en una matriz de desemejanza. Epsilon 0.95 significa efectivamente, como máximo, "0.05 de la disimilitud máxima observada". Una versión alternativa que debería arrojar el mismo resultado es:
D = distance.squareform(distance.pdist(X))
S = np.max(D) - D
db = DBSCAN(eps=0.95 * np.max(D), min_samples=10).fit(S)
Mientras que en el segundo ejemplo, fit(X)
realmente procesa los datos de entrada sin procesar , y no una matriz de distancia. En mi humilde opinión, es un hack feo, para sobrecargar el método de esta manera. Es conveniente, pero conduce a malentendidos y tal vez incluso a un uso incorrecto a veces.
En general, no tomaría el DBSCAN de sklearn como referencia. Toda la API parece estar fuertemente impulsada por la clasificación, no por la agrupación. Por lo general, no fit
una agrupación, solo lo hace para los métodos supervisados. Además, sklearn actualmente no usa índices para aceleración, y necesita memoria O(n^2)
(que DBSCAN normalmente no usaría).
En general, debe asegurarse de que su distancia funcione . Si su función de distancia no funciona, ningún algoritmo basado en la distancia producirá los resultados deseados. En algunos conjuntos de datos, las distancias ingenuas como Euclidiana funcionan mejor cuando primero normalizas tus datos. En otros conjuntos de datos, usted tiene una buena comprensión de qué distancia es (por ejemplo, datos geográficos. ¡Hacer una estandarización en esto obviamente no tiene sentido, ni tampoco la distancia euclidiana!)
¿La entrada a sklearn.clustering.DBSCAN debe procesarse previamente?
En el ejemplo http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#example-cluster-plot-dbscan-py, las distancias entre las muestras de entrada X se calculan y normalizan:
D = distance.squareform(distance.pdist(X))
S = 1 - (D / np.max(D))
db = DBSCAN(eps=0.95, min_samples=10).fit(S)
En otro ejemplo para v0.14 ( http://jaquesgrobler.github.io/online-sklearn-build/auto_examples/cluster/plot_dbscan.html ) se realiza una escalación:
X = StandardScaler().fit_transform(X)
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
Baso mi código en el último ejemplo y tengo la impresión de clúster funciona mejor con esta escala. Sin embargo, esta escala "Estandariza las características eliminando la media y escalando a la varianza de la unidad". Intento encontrar 2d clusters. Si tengo mis clústeres distribuidos en un área cuadrada, digamos 100x100, no veo ningún problema en la escala. Sin embargo, si se distribuyen en un área rectangular, por ejemplo, 800x200, la escala ''comprime'' mis muestras y cambia las distancias relativas entre ellas en una dimensión. Esto deteriora la agrupación, ¿no? O estoy entendiendo algo ¿incorrecto? ¿Debo aplicar algo de preprocesamiento, o puedo simplemente ingresar mis datos ''en bruto''?