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:
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:
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:
Frontières de clusters: [0, 38, 195, 246]
machine-learning
clustering
sequence
général
la source
la source
Réponses:
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: 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.réx < - 20 réx > 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:
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.
la source
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?
la source
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
la source