Pregunta

Suponga un grupo de puntos de datos, como uno trazado aquí (este gráfico no es específico para mi problema, pero solo se usa como un ejemplo adecuado):

Inspeccionando el gráfico de dispersión visualmente, es bastante obvio que los puntos de datos forman dos 'grupos', con algunos puntos aleatorios que obviamente no pertenecen a ninguno de los dos.

Estoy buscando un algoritmo que me permita:

  • Comience con un conjunto de datos de dos o más dimensiones.
  • detectar tales grupos del conjunto de datos sin conocimiento previo sobre cuántos (o si alguno) podría estar allí
  • Una vez que se han detectado los grupos, "preguntar" al modelo de grupos, si un nuevo punto de muestra parece encajar en cualquiera de los grupos
¿Fue útil?

Solución

Hay muchas opciones, pero si está interesado en la probabilidad de que un nuevo punto de datos pertenezca a una mezcla en particular, utilizaría un enfoque probabilístico como el modelado de la mezcla gaussiana, ya sea estimado por la máxima probabilidad o Bayes.

Estimación de máxima probabilidad de Los modelos de mezclas se implementan en MATLAB.

Su requisito de que se desconoce el número de componentes hace que su modelo sea más complejo. El enfoque probabilístico dominante es colocar un proceso de Dirichlet antes de la distribución de la mezcla y la estimación por algún método bayesiano. Por ejemplo, ver Este documento sobre modelos de mezcla gaussianas infinitas. El modelo de mezcla DP le dará inferencia sobre la cantidad de componentes y los componentes a los que pertenecen cada elemento, que es exactamente lo que desea. Alternativamente, puede realizar la selección del modelo en el número de componentes, pero esto generalmente es menos elegante.

Hay muchas implementación de modelos de mezcla DP, pero pueden no ser tan convenientes. Por ejemplo, aquí hay un Implementación de MATLAB.

Su gráfico sugiere que es un usuario R. En ese caso, si está buscando soluciones preempaquetadas, la respuesta a su pregunta radica en esto Vista de tareas para el análisis de clúster.

Otros consejos

Creo que estás buscando algo en la línea de un Algoritmo de agrupación de K-means.

Debería poder encontrar implementaciones adecuadas en la mayoría de los idiomas de propósito general.

Necesita uno de algoritmos de agrupación. Todos ellos pueden ser devueltos en 2 grupos:

  1. Usted especifica el número de grupos (grupos) - 2 grupos en su ejemplo
  2. algoritmo intente adivinar el número correcto de clústeres por sí mismo

Si desea un algoritmo de primer tipo, entonces K-means es lo que realmente necesita.

Si desea un algoritmo de segundo tipo, entonces probablemente necesite uno de algoritmos de agrupación jerárquica. Nunca he implementado ninguno de ellos. Pero veo una manera fácil de mejorar K-means de tal manera que será innecesario especificar el número de grupos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top