Tengo una matriz (simétrica) M
que representa la distancia entre cada par de nodos. Por ejemplo,
ABCDEFGHIJKL A 0 20 20 20 40 60 60 60100120120120 B 20 0 20 20 60 80 80 80120140140140 C 20 20 0 20 60 80 80 80120140140140 D 20 20 20 0 60 80 80 80120140140140 E 40 60 60 60 0 20 20 20 60 80 80 80 F 60 80 80 80 20 0 20 20 40 60 60 60 G 60 80 80 80 20 20 0 20 60 80 80 80 H 60 80 80 80 20 20 20 0 60 80 80 80 I 100120120120 60 40 60 60 0 20 20 20 J 120140140140 80 60 80 80 20 0 20 20 K 120140140140 80 60 80 80 20 20 0 20 L 120140140140 80 60 80 80 20 20 20 0
¿Existe algún método para extraer grupos de M
(si es necesario, el número de grupos se puede arreglar), de modo que cada grupo contenga nodos con pequeñas distancias entre ellos. En el ejemplo, los grupos serían (A, B, C, D)
, (E, F, G, H)
y (I, J, K, L)
.
Ya probé UPGMA y k
-significa pero los grupos resultantes son muy malos.
Las distancias son los pasos promedio que un caminante aleatorio tomaría para ir de un nodo A
a otro B
( != A
) y regresar al nodo A
. Está garantizado que M^1/2
es una métrica. Para ejecutar k
-means, no uso el centroide. Defino la distancia entre el n
grupo de nodos c
como la distancia promedio entre n
y todos los nodos c
.
Muchas gracias :)
fuente
Respuestas:
Hay muchas opciones.
Agrupación de k-medoides
Primero, puede intentar particionar alrededor de medoides (pam) en lugar de usar el agrupamiento k-means. Este es más robusto y podría dar mejores resultados. Van der Laan reformuló el algoritmo. Si va a implementarlo usted mismo, vale la pena leer su artículo .
Existe un algoritmo de agrupamiento de k-medoides específico para grandes conjuntos de datos. El algoritmo se llama Clara en R y se describe en el capítulo 3 de Búsqueda de grupos en datos: una introducción al análisis de conglomerados. por Kaufman, L y Rousseeuw, PJ (1990).
agrupación jerárquica
En lugar de UPGMA, puede probar otras opciones de agrupación jerárquica. En primer lugar, cuando utiliza la agrupación jerárquica, asegúrese de definir el método de partición correctamente. Este método de partición es esencialmente cómo se calculan las distancias entre observaciones y grupos. Utilizo principalmente el método de Ward o el enlace completo, pero otras opciones pueden ser la opción para usted.
No sé si ya lo intentó, pero el método de enlace único o la unión de vecinos a menudo se prefiere a UPGMA en aplicaciones filogenéticas. Si aún no lo probaste, también podrías intentarlo, ya que a menudo da resultados notablemente buenos.
En R puedes echar un vistazo al paquete de clúster . Todos los algoritmos descritos se implementan allí. Consulte "pam", "clara", "hclust" ... Compruebe también la implementación diferente del algoritmo en "kmeans". A veces, elegir otro algoritmo puede mejorar sustancialmente la agrupación.
EDITAR: solo pensé en algo: si trabajas con gráficos y nodos y similares, también deberías echar un vistazo al algoritmo de agrupación de markov. Ese se usa, por ejemplo, en la agrupación de secuencias basadas en similitudes de explosión, y funciona increíblemente bien. Puede hacer el agrupamiento por usted o darle algunas ideas sobre cómo resolver el problema de investigación en el que se está enfocando. Sin saber nada al respecto, supongo que definitivamente vale la pena ver sus resultados. Si puedo decirlo, todavía considero que este método de Stijn van Dongen es uno de los mejores resultados en agrupación que he encontrado.
http://www.micans.org/mcl/
fuente
Una forma de resaltar clústeres en su matriz de distancia es a través del escalado multidimensional . Al proyectar individuos (aquí lo que llaman sus nodos) en un espacio 2D, proporciona una solución comparable a la PCA. Esto no está supervisado, por lo que no podrá especificar a priori el número de clústeres, pero creo que puede ayudar a resumir rápidamente una distancia dada o una matriz de similitud.
Esto es lo que obtendría con sus datos:
Agregué una pequeña fluctuación en las coordenadas x e y para permitir distinguir casos. Reemplace
tmp
por1-tmp
si prefiere trabajar con diferencias, pero esto produce esencialmente la misma imagen. Sin embargo, aquí está la solución de agrupamiento jerárquico, con criterios de aglomeración únicos :Puede refinar aún más la selección de grupos basados en el dendrograma, o métodos más robustos, vea, por ejemplo, esta pregunta relacionada: ¿Qué criterios de detención para el agrupamiento jerárquico aglomerativo se utilizan en la práctica?
fuente
La agrupación espectral [1] requiere una matriz de afinidad, la agrupación se define por las primeras funciones propias de de la descomposición deK
Con es la matriz de afinidad de los datos y es la matriz diagonal definida como (editar: perdón por no estar claro, pero puede generar una matriz de afinidad a partir de una matriz de distancia siempre que sepa el máximo posible / distancia razonable como , aunque también existen otros esquemas)A D Aij=1−dij/max(d)
Dado que es la descomposición propia de , con funciones propias apiladas como columnas, manteniendo solo los vectores propios más grandes en , definimos la matriz normalizada de filasX L K X
Cada fila de es un punto en y se puede agrupar con un algoritmo de agrupamiento ordinario (como K-means).Y Rk
Mira mi respuesta aquí para ver un ejemplo: https://stackoverflow.com/a/37933688/2874779
[1] Ng, AY, Jordan, MI y Weiss, Y. (2002). Sobre agrupamiento espectral: análisis y un algoritmo. Avances en sistemas de procesamiento de información neuronal, 2, 849-856. Pg.2
fuente
Lo que está haciendo es tratar de agrupar nodos de un gráfico, o red, que están cerca uno del otro. Hay todo un campo de investigación dedicado a este problema que a veces se denomina detección comunitaria en redes . Mirar su problema desde este punto de vista probablemente puede aclarar las cosas.
Encontrará muchos algoritmos dedicados a este problema y, de hecho, algunos de ellos se basan en la misma idea que tenía, que es medir distancias entre nodos con caminatas aleatorias.
El problema a menudo se formula como la optimización de la modularidad [1] donde la modularidad de una agrupación mide qué tan bien la agrupación separa la red en grupos densamente conectados (es decir, grupos donde los nodos están cerca unos de otros).
En realidad, puede demostrar que la modularidad es igual a la probabilidad de que un caminante aleatorio permanezca, después de un paso, en los mismos grupos que inicialmente menos la misma probabilidad para dos caminantes aleatorios independientes [2].
Si permite más pasos de los caminantes aleatorios, está buscando una agrupación más gruesa de la red. El número de pasos de la caminata aleatoria juega, por lo tanto, el papel de un parámetro de resolución que permite recuperar una jerarquía de grupos. En este caso, la cantidad que expresa la tendencia de los caminantes aleatorios a permanecer en su grupo inicial después de t pasos se llama estabilidad de Markov de una partición en el tiempo t [2] y es equivalente a la modularidad cuando t = 1 .
Por lo tanto, puede resolver su problema encontrando el agrupamiento de su gráfico que optimiza la estabilidad en un momento dado t , donde t es el parámetro de resolución ( t más grande le dará grupos más grandes). Uno de los métodos más utilizados para optimizar la estabilidad (o modularidad con un parámetro de resolución) es el algoritmo de Louvain [3]. Puede encontrar una implementación aquí: https://github.com/michaelschaub/generalizedLouvain .
[1] Newman, MEJ y Girvan, M. Encontrar y evaluar la estructura comunitaria en redes. Phys. Rev. E 69, 026113 (2004).
[2] Delvenne, J.-C., Yaliraki, SN y Barahona, M. Estabilidad de las comunidades gráficas a través de escalas de tiempo. Proc. Natl. Acad. Sci. 107, 12755–12760 (2010).
[3] Blondel, VD, Guillaume, J.-L., Lambiotte, R. y Lefebvre, E. Despliegue rápido de comunidades en grandes redes. J. Stat. Mech Teoría Exp. 2008, P10008 (2008).
fuente
Bueno, es posible realizar la agrupación de K-means en una matriz de similitud dada, primero debe centrar la matriz y luego tomar los valores propios de la matriz. El paso final y el más importante es multiplicar los dos primeros conjuntos de vectores propios a la raíz cuadrada de las diagonales de los valores propios para obtener los vectores y luego avanzar con K-means. Debajo del código se muestra cómo hacerlo. Puede cambiar la matriz de similitud. fpdist es la matriz de similitud.
fuente
Antes de intentar ejecutar el agrupamiento en la matriz, puede intentar hacer una de las técnicas de análisis factorial y conservar solo las variables más importantes para calcular la matriz de distancia. Otra cosa que puede hacer es intentar usar métodos difusos que tienden a funcionar mejor (al menos en mi experiencia) en este tipo de casos, primero intente Cmeans, Fuzzy K-medoids y Specially GKCmeans.
fuente
Co-clustering es una de las respuestas, creo. Pero no soy experto aquí. Co-clustring no es un método para recién nacidos, por lo que puede encontrar algunos algos en R, wiki muestra esos conceptos en el buen sentido. Otro método que no se menciona es la partición de gráficos (pero veo que el gráfico no sería escaso, la partición de gráficos sería útil si su matriz estuviera dominada por valores que significan = distancia máxima = sin similitud entre los nodos).
fuente
Examine la PROPAGACIÓN DE AFINIDAD. Esta técnica toma como entrada la matriz de similitud y produce un número óptimo de grupos junto con un ejemplo representativo para cada grupo.
fuente
Primero convierta la matriz de distancia en una matriz de coordenadas a través de https://math.stackexchange.com/a/423898, luego podrá usar fácilmente cualquier algoritmo de agrupamiento existente de manera efectiva.
fuente
También puede usar el algoritmo de Kruskal para encontrar árboles de expansión mínima, pero termina tan pronto como obtenga los tres grupos. Lo intenté de esta manera y produce los grupos que mencionaste: {ABCD}, {EFGH} y {IJKL}.
fuente