Agrupamiento con coseno similitud

8

Tengo un gran conjunto de datos y una similitud de coseno entre ellos. Me gustaría agruparlos usando la similitud de coseno que reúne objetos similares sin necesidad de especificar de antemano el número de grupos que espero.

Leí la documentación de sklearn de DBSCAN y Affinity Propagation, donde ambos requieren una matriz de distancia (no una matriz de similitud de coseno).

Realmente, solo estoy buscando cualquier algoritmo que no requiera a) una métrica de distancia yb) un número predeterminado de clústeres .

¿Alguien sabe de un algoritmo que haría eso?

Smith Volka
fuente

Respuestas:

8

Primero, cada algoritmo de agrupamiento está utilizando algún tipo de métrica de distancia. Lo cual es realmente importante, porque cada métrica tiene sus propias propiedades y es adecuada para diferentes tipos de problemas.

Dijiste que tienes similitud de coseno entre tus registros, por lo que en realidad es una matriz de distancia. Puede usar esta matriz como entrada en algún algoritmo de agrupamiento.

Ahora, sugiero comenzar con la agrupación jerárquica: no requiere un número definido de agrupaciones y puede ingresar datos y seleccionar una distancia, o ingresar una matriz de distancia (donde calculó la distancia de alguna manera).

Tenga en cuenta que el agrupamiento jerárquico es costoso de calcular, por lo que si tiene muchos datos, puede comenzar con solo una muestra.

HonzaB
fuente
Gracias por la útil respuesta. Tengo un problema similar como este datascience.stackexchange.com/questions/20198 y me gustaría usar la respuesta dada en él. Sin embargo, para encontrar los puntos más cercanos al centroide, utiliza la distancia mínima del coseno. Si estoy usando la similitud de coseno, ¿sería la mayor similitud de coseno?
Smith Volka
1
Simplemente puede convertir la distancia en similitud. Si la distancia de A a B es 0.3, entonces la similitud será 1-0.3 = 0.7.
HonzaB
3

DBSCAN se puede implementar trivialmente con una medida de similitud en lugar de una distancia. Solo necesita cambiar el <= epsilon en a> = epsilon.

HAC también funciona bien con similitudes (al menos enlace simple, enlace completo, UPGMA, WPGMA - no use Ward), si intercambia "min" y "max" (desea fusionar con máxima similitud en lugar de mínimo distancia).

Si eres flojo, también puedes transformar tu similitud en una distancia. Si tiene un máximo fijo, dist = max-sim a menudo lo hará.

HA SALIDO - Anony-Mousse
fuente
Gracias por la respuesta. ¿Qué quiso decir ypu con epsilon en <= epsilon en a> = epsilon?
Smith Volka
Ok, el valor predeterminado de eps en sklearn es 0.5. ¿Es correcto si aumento este valor (por ejemplo, 0.8). ¿Es lo que quisiste decir en tu respuesta?
Smith Volka
DBSCAN utiliza un umbral de distancia máxima de épsilon. Por GDBSCAN, también puede utilizar una similitud mínima en su lugar. necesita cambiar el código, no el parámetro . Sklearn no admite similitudes. ELKI tiene soporte directo para funciones de similitud en GDBSCAN a través de SimilarityNeighborPredicate.
HA SALIDO - Anony-Mousse
Si no puede codificar, puede hacer el enfoque "vago" que mencioné. Debería dar los mismos resultados.
HA SALIDO - Anony-Mousse
¿Qué quiere decir con Si tiene un máximo fijo, dist = max-sim lo hará a menudo? Estoy interesado en probarlo.
Smith Volka
3

Usaría el agrupamiento jerárquico de sklearn

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from scipy.cluster import  hierarchy

#Vectorizing
X = CountVectorizer().fit_transform(docs)
X = TfidfTransformer().fit_transform(X)
#Clustering
X = X.todense()
threshold = 0.1
Z = hierarchy.linkage(X,"average", metric="cosine")
C = hierarchy.fcluster(Z, threshold, criterion="distance")

Ces tu agrupamiento de los documentos docs.

Puede usar otras métricas en lugar de cosine, y usar un umbral diferente al0.1

Uri Goren
fuente
¿Es "docs" la matriz de datos original? ¿Dónde colocar la matriz de datos o dónde colocar la matriz de similitud de coseno? gracias
Bill Ancalagon el negro
1
docsson los documentos, Zes la matriz de similitud de coseno
Uri Goren
3

Creo que el paquete clustMixType podría brindarle mejores resultados / ideas.

Al usar este paquete , puede usar la combinación de datos categóricos y numéricos directamente, no necesita ningún tipo de codificación activa.

Solo necesita alimentar los datos y se segrega automáticamente en datos categóricos y numéricos, si encuentra algún problema en el momento de la segregación, puede usar funciones como as.factor(to convert to a categorical)y as.numeric(to convert to a Numeric field).

Puede calcular de Lambda(mean Distance value)antemano e introducirlo como una entrada al algoritmo.

Si no conoce el número óptimo de las agrupaciones, se puede utilizar WSS(within Sum of Squares), plot(elbow chart)para decidir el número óptimo de las agrupaciones.

Toros91
fuente
2

Todos los métodos de agrupamiento utilizan una métrica de distancia de algún tipo. Y recuerde que la distancia es esencialmente una medida de disimilitud. Entonces, si normaliza su similitud entre 0 y 1, su distancia es simplemente 1-similitud

En cuanto a los algoritmos que no requieren que se especifiquen varios grupos, existen, por supuesto, técnicas de agrupamiento jerárquico, que esencialmente construyen una estructura similar a un árbol que puedes "cortar" donde quieras (puedes usar algunas métricas de rendimiento para hacerlo automáticamente). )

X-means es una versión de K-means que intenta un cierto número de K y elige la que maximiza alguna función de evaluación.

El cambio medio también "encuentra" un número natural de grupos pero es sensible a otros parámetros, como el ancho de banda, por ejemplo.

Valentin Calomme
fuente