Algoritmo per la segmentazione dei dati di sequenza


8

Ho una grande sequenza di vettori di lunghezza N. Ho bisogno di un algoritmo di apprendimento senza supervisione per dividere questi vettori in segmenti M.

Per esempio:

inserisci qui la descrizione dell'immagine

K-mean non è adatto, perché inserisce elementi simili da posizioni diverse in un singolo cluster.

Aggiornare:

I dati reali si presentano così:

inserisci qui la descrizione dell'immagine

Qui vedo 3 cluster: [0..50], [50..200], [200..250]

Aggiornamento 2:

Ho usato k-medie modificati e ho ottenuto questo risultato accettabile:

inserisci qui la descrizione dell'immagine

Confini dei cluster: [0, 38, 195, 246]


2
La qualità della domanda dovrebbe essere migliorata per ottenere una risposta corretta, ad esempio tutte le sequenze cambiano sempre nello stesso punto (come come illustrato nell'esempio)?
Kasra Manshaei,

I miei dati reali sono più complicati. È un elenco di vettori di 9 dimensioni. Aggiungerò un'immagine alla sezione principale.
generall

Risposte:


8

Si prega di vedere il mio commento sopra e questa è la mia risposta in base a ciò che ho capito dalla tua domanda:

Come affermato correttamente, non è necessario il clustering ma la segmentazione . In effetti stai cercando Punti di cambiamento nelle tue serie storiche. La risposta dipende davvero dalla complessità dei tuoi dati. Se i dati sono semplici come nell'esempio precedente, puoi usare la differenza di vettori che si alza in corrispondenza dei punti che cambiano e impostare una soglia che rileva quei punti come sotto: inserisci qui la descrizione dell'immagine Come vedi ad esempio una soglia di 20 (es.dx<20 e dx>20) rileverà i punti. Naturalmente per dati reali è necessario indagare di più per trovare le soglie.

Pre-processing

Si noti che esiste un compromesso tra la posizione accurata del punto di cambio e il numero esatto di segmenti, ad esempio se si utilizzano i dati originali si troveranno i punti di cambio esatti ma l'intero metodo è sensibile al rumore, ma se si liscia i tuoi segnali prima potresti non trovare i cambiamenti esatti ma l'effetto del rumore sarà molto inferiore come mostrato nelle figure seguenti:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Conclusione

Il mio suggerimento è di regolare prima i segnali e scegliere un mthod di clustering (ad es. Utilizzando GMM ) per trovare una stima accurata del numero di segmenti nei segnali. Date queste informazioni, è possibile iniziare a trovare punti di modifica vincolati dal numero di segmenti trovati dalla parte precedente.

Spero che tutto abbia aiutato :)

In bocca al lupo!

AGGIORNARE

Fortunatamente i tuoi dati sono piuttosto semplici e puliti. Consiglio vivamente algoritmi di riduzione della dimensionalità (ad es. Semplice PCA ). Immagino che riveli la struttura interna dei tuoi cluster. Una volta applicato il PCA ai dati, è possibile utilizzare k-mean molto più facilmente e con maggiore precisione.

Una soluzione seria (!)

Secondo i tuoi dati, vedo che la distribuzione generativa di diversi segmenti è diversa, il che è una grande opportunità per segmentare le tue serie storiche. Vedi questo (originale , archivio , altra fonte ) che è probabilmente la soluzione migliore e più all'avanguardia al tuo problema. L'idea principale alla base di questo documento è che se diversi segmenti di una serie temporale sono generati da diverse distribuzioni sottostanti è possibile trovare tali distribuzioni, impostare tham come verità di base per il proprio approccio al clustering e trovare cluster.

Ad esempio, supponi un lungo video in cui nei primi 10 minuti qualcuno è in bicicletta, nei secondi 10 minuti che corre e nel terzo è seduto. puoi raggruppare questi tre diversi segmenti (attività) usando questo approccio.


Grazie per la risposta dettagliata. Come puoi vedere sopra, non posso usare le soglie per la mia sequenza di dati reali, penso, è troppo complicato per questo. Sto cercando di modificare l'algoritmo k-mean, prenderà in considerazione la condizione della sequenza (l'elemento può appartenere solo a uno dei due cluster vicini). Spero di non reinventare la ruota. :)
generalmente

1
Penso che i tuoi dati non siano così rumorosi (cioè complicati) e puoi andare per cose di soglia. il punto è che hai un'impressione dei dati in modo da poter usare un po 'di algoritmo supervisionato, cioè cercare di apprendere soglie (e spero che si generalizzi bene!). Inoltre
aggiorno la

Grazie per gli interessanti collegamenti, penso, può essere usato per il mio scopo, ma per ora utilizzo k-mean con le mie modifiche, il che mi dà risultati accettabili (foto in questione).
generall

1
risultati molto belli! mossa intelligente. Sono orgoglioso di te: D Buona fortuna!
Kasra Manshaei,

1

K-significa che il clustering è noto per fornire i minimi locali, a seconda dell'inizializzazione iniziale dei centri del cluster.

Tuttavia, penso che la segmentazione dei k-mezzi possa, a mio avviso, essere risolta a livello globale, poiché non permettiamo nulla nel trovare la soluzione.

Dai tuoi commenti vedo che alla fine sei riuscito a raggiungere una segmentazione. Potresti dare un feedback, per favore? La tua soluzione è la migliore? O ti sei accontentato di una soluzione abbastanza buona?


La segmentazione dei mezzi K può anche fornire minimi locali, poiché è ancora necessario scegliere i medoidi \ centroidi iniziali. La mia soluzione attuale è abbastanza buona per me, ma non posso affermare che sia la migliore. Posso condividere i dettagli della mia soluzione se ti interessa.
generall

Dipende da come lo implementi. Nel frattempo, ho scoperto in alcune pubblicazioni che per la segmentazione è possibile trovare il minimo globale, nel tempo polinomiale.
Nolatar,

0

Proprio come un suggerimento: potresti provare a utilizzare l'algoritmo DBSCAN, poiché spesso funziona molto meglio di K-medie per il clustering

Altrimenti, se vuoi provare qualcosa di nuovo per il clustering e apprendere alcune cose interessanti, ti suggerisco di provare alcune analisi dei dati topologici attraverso diagrammi persistenti. Ti lascio qui una bella introduzione semplice :)

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.