Algoritmo para segmentación de datos de secuencia

8

Tengo una gran secuencia de vectores de longitud N. Necesito un algoritmo de aprendizaje no supervisado para dividir estos vectores en segmentos M.

Por ejemplo:

ingrese la descripción de la imagen aquí

K-means no es adecuado, porque pone elementos similares de diferentes ubicaciones en un solo clúster.

Actualizar:

Los datos reales se ven así:

ingrese la descripción de la imagen aquí

Aquí, veo 3 grupos: [0..50], [50..200], [200..250]

Actualización 2:

Usé k-means modificado y obtuve este resultado aceptable:

ingrese la descripción de la imagen aquí

Fronteras de los racimos: [0, 38, 195, 246]

generall
fuente
2
La calidad de la pregunta debe mejorarse para obtener una respuesta adecuada, por ejemplo, ¿cambian siempre todas las secuencias en el mismo punto (como se ilustra en el ejemplo)?
Kasra Manshaei
Mis datos reales son más complicados. Es una lista de vectores de 9 dimensiones. Agregaré una imagen a la sección principal.
generall

Respuestas:

8

Consulte mi comentario anterior y esta es mi respuesta de acuerdo con lo que entendí de su pregunta:

Como ha indicado correctamente, no necesita la agrupación sino la segmentación . De hecho, está buscando puntos de cambio en su serie de tiempo. La respuesta realmente depende de la complejidad de sus datos. Si los datos son tan simples como el ejemplo anterior, puede usar la diferencia de vectores que se sobrepasa en los puntos cambiantes y establecer un umbral para detectar esos puntos como se muestra a continuación: ingrese la descripción de la imagen aquí Como puede ver, por ejemplo, un umbral de 20 (es decirreX<-20 y reX>20) detectará los puntos. Por supuesto, para datos reales necesita investigar más para encontrar los umbrales.

Preprocesamiento

Tenga en cuenta que existe una compensación entre la ubicación precisa del punto de cambio y el número exacto de segmentos, es decir, si utiliza los datos originales, encontrará los puntos de cambio exactos, pero todo el método es sensible al ruido, pero si suaviza Puede que sus señales primero no encuentren los cambios exactos, pero el efecto de ruido será mucho menor, como se muestra en las siguientes figuras:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Conclusión

Mi sugerencia es suavizar sus señales primero e ir por un método de agrupación simple (por ejemplo, usando GMM s) para encontrar una estimación precisa del número de segmentos en las señales. Dada esta información, puede comenzar a encontrar puntos de cambio restringidos por el número de segmentos que encontró en la parte anterior.

Espero que todo haya ayudado :)

¡Buena suerte!

ACTUALIZAR

Afortunadamente, sus datos son bastante sencillos y limpios. Recomiendo encarecidamente los algoritmos de reducción de dimensionalidad (por ejemplo, PCA simple ). Supongo que revela la estructura interna de sus grupos. Una vez que aplique PCA a los datos, puede usar k-significa mucho más fácil y más preciso.

Una solución seria (!)

De acuerdo con sus datos, veo que la distribución generativa de los diferentes segmentos es diferente, lo que es una gran oportunidad para segmentar sus series de tiempo. Vea esto (original , archivo , otra fuente ), que es probablemente la mejor y más avanzada solución a su problema. La idea principal detrás de este documento es que si diferentes segmentos de una serie de tiempo son generados por diferentes distribuciones subyacentes, puede encontrar esas distribuciones, establecerlas como la verdad fundamental para su enfoque de agrupación y encontrar agrupaciones.

Por ejemplo, suponga un video largo en el que los primeros 10 minutos alguien está andando en bicicleta, en los segundos 10 minutos está corriendo y en el tercero está sentado. Puede agrupar estos tres segmentos (actividades) diferentes utilizando este enfoque.

Kasra Manshaei
fuente
Gracias por la respuesta detallada. Como puede ver arriba, no puedo usar umbrales para mi secuencia de datos real, creo que es demasiado complicado. Estoy tratando de modificar el algoritmo k-means, considerará la condición de secuencia (el elemento solo puede pertenecer a uno de los dos grupos vecinos). Espero no reinventar la rueda. :)
generall
1
Creo que sus datos no son tan ruidosos (es decir, complicados) y puede optar por umbral. el punto es que tiene una impresión de los datos para que pueda usar un algoritmo supervisado, es decir, tratar de aprender los umbrales (¡y espero que se generalice bien!). También actualizo mi respuesta para una buena solución :)
Kasra Manshaei
Gracias por los enlaces interesantes, creo que se puede usar para mi propósito, pero por ahora, uso k-means con mis modificaciones, lo que me da resultados aceptables (foto en cuestión).
generall
1
muy buenos resultados! movimiento inteligente. Estoy orgulloso de ti: D ¡Buena suerte!
Kasra Manshaei
1

Se sabe que la agrupación de K-means da mínimos locales, dependiendo de su inicialización inicial de los centros de agrupación.

Sin embargo, creo que la segmentación k-means puede resolverse globalmente, ya que no permutamos nada para encontrar la solución.

Puedo ver en sus comentarios que finalmente logró llegar a una segmentación. ¿Podría darnos su opinión, por favor? ¿Es su solución la mejor solución? ¿O te conformaste con una solución lo suficientemente buena?

Nolatar
fuente
La segmentación K-means también puede dar mínimos locales, ya que aún necesita elegir medoides \ centroides iniciales. Mi solución actual es lo suficientemente buena para mí, pero no puedo afirmar que sea la mejor. Puedo compartir detalles de mi solución si te interesa.
generall
Depende de cómo lo implementes. Mientras tanto, descubrí en cierta literatura que para la segmentación, es factible encontrar el mínimo global, en tiempo polinómico.
Nolatar
0

Solo como una sugerencia: puede intentar usar el algoritmo DBSCAN, ya que a menudo funciona mucho mejor que K-means para la agrupación

De lo contrario, si desea probar algo nuevo para la agrupación y aprender algunas cosas interesantes, le sugiero que pruebe un análisis de datos topológicos a través de diagramas persistentes. Voy a dejarte aquí una bonita introducción fácil :)

https://towardsdatascience.com/persistent-homology-with-examples-1974d4b9c3d0

Davide ND
fuente