Algorithme de segmentation des données de séquence

8

J'ai une grande séquence de vecteurs de longueur N. J'ai besoin d'un algorithme d'apprentissage non supervisé pour diviser ces vecteurs en M segments.

Par exemple:

entrez la description de l'image ici

K-means ne convient pas, car il place des éléments similaires de différents emplacements dans un seul cluster.

Mise à jour:

Les vraies données ressemblent à ceci:

entrez la description de l'image ici

Ici, je vois 3 clusters: [0..50], [50..200], [200..250]

Mise à jour 2:

J'ai utilisé des k-means modifiés et j'ai obtenu ce résultat acceptable:

entrez la description de l'image ici

Frontières de clusters: [0, 38, 195, 246]

général
la source
2
La qualité de la question doit être améliorée pour obtenir une réponse correcte. Par exemple, toutes les séquences changent-elles toujours au même point (comme vous l'avez illustré dans l'exemple)?
Kasra Manshaei
Mes vraies données sont plus compliquées. C'est une liste de vecteurs à 9 dimensions. Je vais ajouter une image à la section principale.
generall

Réponses:

8

Veuillez voir mon commentaire ci-dessus et voici ma réponse selon ce que j'ai compris de votre question:

Comme vous l'avez correctement dit, vous n'avez pas besoin de clustering mais de segmentation . En effet, vous recherchez des points de changement dans votre série chronologique. La réponse dépend vraiment de la complexité de vos données. Si les données sont aussi simples que l'exemple ci-dessus, vous pouvez utiliser la différence de vecteurs qui dépasse les points de changement et définir un seuil détectant ces points comme ci-dessous: entrez la description de l'image ici Comme vous voyez par exemple un seuil de 20 (c'est-à-dire et ) détectera les points. Bien sûr, pour les données réelles, vous devez en savoir plus pour trouver les seuils.X<-20X>20

Prétraitement

Veuillez noter qu'il y a un compromis entre l'emplacement précis du point de changement et le nombre précis de segments, c'est-à-dire que si vous utilisez les données d'origine, vous trouverez les points de changement exacts mais toute la méthode est sensible au bruit mais si vous lissez vos signaux en premier, vous ne trouverez peut-être pas les changements exacts, mais l'effet de bruit sera beaucoup moins important, comme indiqué dans les figures ci-dessous:

entrez la description de l'image ici entrez la description de l'image ici

Conclusion

Ma suggestion est de lisser d'abord vos signaux et d'opter pour un simple mthod de clustering (par exemple en utilisant des GMM ) pour trouver une estimation précise du nombre de segments dans les signaux. Compte tenu de ces informations, vous pouvez commencer à trouver des points de changement limités par le nombre de segments que vous avez trouvés dans la partie précédente.

J'espère que tout a aidé :)

Bonne chance!

MISE À JOUR

Heureusement, vos données sont assez simples et propres. Je recommande fortement les algorithmes de réduction de dimensionnalité (par exemple PCA simple ). Je suppose que cela révèle la structure interne de vos clusters. Une fois que vous avez appliqué PCA aux données, vous pouvez utiliser k-means beaucoup plus facilement et plus précisément.

Une solution sérieuse (!)

Selon vos données, je vois que la distribution générative des différents segments est différente, ce qui est une excellente occasion pour vous de segmenter votre série chronologique. Voir ceci (original , archive , autre source ) qui est probablement la meilleure solution et la plus avancée de votre problème. L'idée principale derrière cet article est que si différents segments d'une série chronologique sont générés par différentes distributions sous-jacentes, vous pouvez trouver ces distributions, définir tham comme vérité fondamentale pour votre approche de clustering et trouver des clusters.

Par exemple, supposons une longue vidéo dans laquelle les 10 premières minutes, quelqu'un fait du vélo, les 10 dernières minutes, il court et la troisième, il est assis. vous pouvez regrouper ces trois segments (activités) en utilisant cette approche.

Kasra Manshaei
la source
Merci pour la réponse détaillée. Comme vous pouvez le voir ci-dessus, je ne peux pas utiliser de seuils pour ma vraie séquence de données, je pense, c'est trop compliqué pour cela. J'essaie de modifier l'algorithme k-means, il considérera la condition de séquence (l'élément ne peut appartenir qu'à l'un des deux clusters voisins). J'espère, que je ne réinvente pas la roue. :)
generall
1
Je pense que vos données ne sont pas si bruyantes (c'est-à-dire compliquées) et vous pouvez opter pour des trucs de seuil. le fait est que vous avez une impression des données afin que vous puissiez utiliser un algorithme supervisé, c'est-à-dire essayer d'apprendre les seuils (et j'espère que cela généralisera bien!). Je mets également à jour ma réponse pour une belle solution :)
Kasra Manshaei
Merci pour les liens intéressants, je pense, il peut être utilisé pour mon but, mais pour l'instant, j'utilise k-means avec mes modifications, ce qui me donne des résultats acceptables (photo en question).
generall
1
très bons résultats! mouvement intelligent. Je suis fier de toi: D Good Luck!
Kasra Manshaei
1

Le clustering K-means est connu pour donner des minima locaux, selon votre initialisation initiale des centres de cluster.

Cependant, la segmentation k-means peut, je pense, être résolue globalement, car nous ne permutons rien pour trouver la solution.

Je peux voir dans vos commentaires que vous avez finalement réussi à atteindre une segmentation. Pourriez-vous nous faire part de vos commentaires, s'il vous plaît? Votre solution est-elle la meilleure solution? Ou vous êtes-vous contenté d'une solution suffisamment bonne?

Nolatar
la source
La segmentation K-means peut également donner des minima locaux, car vous devez toujours choisir les médoïdes \ centroïdes initiaux. Ma solution actuelle est assez bonne pour moi, mais je ne peux pas prétendre que c'est la meilleure. Je peux partager les détails de ma solution si cela vous intéresse.
generall
Cela dépend de la façon dont vous l'implémentez. En attendant, j'ai découvert dans certaines publications que pour la segmentation, il est possible de trouver le minimum global, en temps polynomial.
Nolatar
0

Juste une suggestion: vous pourriez essayer d'utiliser l'algorithme DBSCAN, car il fonctionne souvent beaucoup mieux que K-means pour le clustering

Sinon, si vous voulez essayer quelque chose de nouveau pour le clustering et apprendre des choses intéressantes, je vous suggère d'essayer une analyse de données topologiques à travers des diagrammes persistants. Je vais te laisser ici une belle intro facile :)

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

Davide ND
la source