Come posso rilevare a livello di codice segmenti di una serie di dati per adattarsi a curve diverse?


14

Esistono algoritmi documentati per separare sezioni di un determinato set di dati in diverse curve di adattamento ottimale?

Ad esempio, la maggior parte degli umani che guardano questo diagramma di dati lo dividerebbero prontamente in 3 parti: un segmento sinusoidale, un segmento lineare e il segmento esponenziale inverso. In effetti, ho realizzato questo particolare con un'onda sinusoidale, una linea e una semplice formula esponenziale.

Grafico dei dati con tre parti distinte visibili

Esistono algoritmi esistenti per trovare parti del genere, che possono quindi essere adattate separatamente a varie curve / linee per creare una sorta di serie composta di best-fit di sottoinsiemi di dati?

Si noti che sebbene l'esempio abbia le estremità dei segmenti praticamente allineate, questo non sarà necessariamente il caso; potrebbe esserci anche un'improvvisa scossa nei valori in corrispondenza di un taglio di segmento. Forse quei casi saranno più facili da rilevare.

Aggiornamento: ecco un'immagine di un piccolo pezzo di dati del mondo reale: Grafico del mondo reale

Aggiornamento 2: ecco un insieme di dati del mondo reale insolitamente piccolo (solo 509 punti dati):

4,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235

Eccolo qui, tracciato, con la posizione approssimativa di alcuni bordi di elementi del mondo reale noti segnati con linee tratteggiate, un lusso che normalmente non avremmo:

inserisci qui la descrizione dell'immagine

Un lusso che abbiamo, tuttavia, è il senno di poi: i dati nel mio caso non sono una serie temporale, ma sono piuttosto spazialmente correlati; ha senso analizzare un intero set di dati (di solito 5000-15000 punti dati) contemporaneamente, non in modo continuo.


1
ps primo post nel CV; Sono uno sviluppatore di software e di solito frequento SO di più. Mi scuso se ho violato i tabù locali. Molte delle mie ricerche di risposte hanno portato qui, quindi ho pensato che sarebbe stato il posto migliore per chiedere.
whybird,

Perché non pubblichi i dati e cercherò di rispondere alla tua domanda con l'esempio.
IrishStat,

Una possibilità sarebbe quella di adattare l'intera famiglia di curve contemporaneamente, usando un meta-modello. Per rendere le cose più precise, supponiamo che il tuo obiettivo finale sia quello di appianare quell'istogramma, diciamo usando un KDE. Quindi, la tua stima regolare da KDE sarà più precisa se usi un modello in cui la larghezza del kernel può variare nell'intervallo di valori di come nel modello qui usato , equazioni (2) - (3)X
user603

1
Hai costruito l'esempio in modo che l'idea abbia un senso: finora, così bene. Con gli istogrammi reali, è molto più comune che una forma complicata rifletta una miscela di distribuzioni sovrapposte: l'interesse non è quindi nei punti di cambio sull'istogramma osservato che generalmente non esistono in modo convincente o non sono il modo giusto di pensare alle miscele. È possibile, tuttavia, che tu stia utilizzando l '"istogramma" in un modo molto più ampio rispetto a quello standard nella scienza statistica dove significa grafico a barre della frequenza o distribuzione della probabilità (solo).
Nick Cox,

@IrishStat: i soliti set di dati contengono da 5000 a 15000 voci. Stavo cercando di prepararne uno reale riassunto per qui, ma si è rivelato essere un cattivo esempio e ho dovuto ricominciare da capo. D'altra parte, fare ciò mi ha suggerito una risposta parziale in termini di semplice livellamento e calcolo della media di gruppi di dati per la ricerca iniziale di schemi, da affinare in seguito, quindi grazie :) :) Ne ho uno reale largo solo 509 che sembra che potrebbe essere buono; Lo aggiungerò alla domanda quando posso.
whybird,

Risposte:


2

La mia interpretazione della domanda è che l'OP sta cercando metodologie che si adattino alla forma o alle forme degli esempi forniti, non ai residui HAC. Inoltre, sono richieste routine automatizzate che non richiedono un significativo intervento umano o di analista. Box-Jenkins potrebbe non essere appropriato, nonostante la loro enfasi in questo thread, poiché richiedono un sostanziale coinvolgimento degli analisti.

Esistono moduli R per questo tipo di adattamento di pattern non basato sul momento. Il clustering di distribuzione delle permutazioni è una tale tecnica di abbinamento dei modelli sviluppata da uno scienziato del Max Planck Institute che soddisfa i criteri che hai delineato. La sua applicazione è ai dati delle serie temporali, ma non si limita a questo. Ecco una citazione per il modulo R che è stato sviluppato:

pdc: un pacchetto R per il raggruppamento basato su complessità delle serie storiche di Andreas Brandmaier

Oltre a PDC, c'è l'apprendimento automatico, routine iSax sviluppata da Eamon Keogh presso UC Irvine che vale anche la pena di essere confrontata.

Infine, c'è questo articolo su Data Smashing: Uncovering Lurking Order in Datadi Chattopadhyay e Lipson. Oltre al titolo intelligente, c'è uno scopo serio al lavoro. Ecco l'abstract: "Dal riconoscimento vocale automatico alla scoperta di stelle insolite, alla base di quasi tutte le attività di rilevazione automatizzata c'è la possibilità di confrontare e confrontare flussi di dati tra loro, identificare connessioni e individuare valori anomali. Nonostante la prevalenza dei dati, tuttavia, i metodi automatizzati non tengono il passo. Un collo di bottiglia chiave è che la maggior parte degli algoritmi di confronto dei dati oggi si affida a un esperto umano per specificare quali "caratteristiche" dei dati sono rilevanti per il confronto. Qui proponiamo un nuovo principio per stimare la somiglianza tra le fonti di arbitraggio flussi di dati, non utilizzando né conoscenza del dominio né apprendimento. Dimostriamo l'applicazione di questo principio all'analisi dei dati da una serie di problemi del mondo reale, tra cui la chiara ambiguità dei modelli elettroencefalografici relativi alle crisi epilettiche, il rilevamento di anomalie dell'attività cardiaca dalle registrazioni del suono cardiaco e la classificazione degli oggetti astronomici dalla fotometria grezza. In tutti questi casi e senza accesso a nessuna conoscenza del dominio, dimostriamo prestazioni alla pari con l'accuratezza raggiunta da algoritmi specializzati e euristica ideata da esperti del dominio. Suggeriamo che i principi di distruzione dei dati possano aprire la porta alla comprensione di osservazioni sempre più complesse, soprattutto quando gli esperti non sanno cosa cercare. " In tutti questi casi e senza accesso a nessuna conoscenza del dominio, dimostriamo prestazioni alla pari con l'accuratezza raggiunta da algoritmi specializzati e euristica ideata da esperti del dominio. Suggeriamo che i principi di distruzione dei dati possano aprire la porta alla comprensione di osservazioni sempre più complesse, soprattutto quando gli esperti non sanno cosa cercare. " In tutti questi casi e senza accesso a nessuna conoscenza del dominio, dimostriamo prestazioni alla pari con l'accuratezza raggiunta da algoritmi specializzati e euristica ideata da esperti del dominio. Suggeriamo che i principi di distruzione dei dati possano aprire la porta alla comprensione di osservazioni sempre più complesse, soprattutto quando gli esperti non sanno cosa cercare. "

Questo approccio va ben oltre l'adattamento curvilineo. Vale la pena dare un'occhiata.


Grazie - hai ragione sul fatto che quello che voglio è trovare automaticamente i cluster, senza l'intervento dell'analista. Per quello che voglio fare per lavorare, dovrò suddividere set di dati di 5000-15000 punti dati in cluster che si conformano bene a semplici formule (comprese quelle ripetitive) senza intervento umano su gruppi di circa 50000 set di dati in un arco di tempo tollerabile dagli umani sull'hardware del computer domestico.
whybird,

Per quanto riguarda quale curva si adatta a ciascun cluster, una volta rilevati i limiti con qualsiasi mezzo, è abbastanza semplice penso di provare solo diversi modelli (onda sinusoidale, polinomiale, esponenziale) e vedere quale dà un r ^ 2 ordinario migliore.
whybird,

2
OK, penso che la cattiva comunicazione derivi da questo: Sax e iSax sono formati di rappresentazione per la memorizzazione e l'elaborazione di serie temporali, non sono algoritmi di clustering o di rilevamento di segmenti / pattern (per posta dell'OP). La mia comprensione dalla tua risposta è stata che Keogh aveva escogitato un algoritmo basato sul formato di rappresentazione SAX e che risolve il problema del PO. Ma penso che non sia quello che volevi dire?
Zhubarb,

2
OK, non c'è bisogno di contattare Keogh, conosco iSax e Sax , sono formati di rappresentazione per l'estrazione efficiente di serie storiche . I link li spiegano. iSax è la versione più recente. Ero eccitato dal mio fraintendimento della tua risposta, da qui le domande (non cercando di essere pedante) :).
Zhubarb,

2
non stavo cercando di nascondere nulla, ho interpretato la "routine isax" come un algoritmo che funziona su isax. Suggerisco che la tua risposta debba essere riformulata / modificata dopo il chiarimento.
Zhubarb,

2

Rilevare i punti di cambiamento in una serie temporale richiede la costruzione di un modello ARIMA globale solido (sicuramente imperfetto dalle modifiche del modello e delle modifiche dei parametri nel tempo nel tuo caso) e quindi identificare il punto di cambiamento più significativo nei parametri di quel modello. Usando i vostri 509 valori il punto di cambiamento più significativo è stato intorno al periodo 353. Ho usato alcuni algoritmi proprietari disponibili in AUTOBOX (che ho aiutato a sviluppare) che potrebbero essere concessi in licenza per la vostra applicazione personalizzata. L'idea di base è quella di separare i dati in due parti e, dopo aver trovato il punto di cambiamento più importante, analizzare nuovamente ciascuno dei due intervalli di tempo separatamente (1-352; 353-509) per determinare ulteriori punti di cambiamento all'interno di ciascuno dei due set. Questo si ripete fino ad avere k sottoinsiemi. Ho allegato il primo passo usando questo approccio.inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


Perché 353 viene segnalato quando 153 e 173 hanno valori P inferiori?
Nick Cox,

@NickCox Buona domanda! Grande commento Ai fini della previsione, l'idea generale è quella di separare il sottoinsieme (significativo) più recente dal sottogruppo più vecchio, motivo per cui 353 ha vinto .... Ai fini qui si selezionerebbero 173.
IrishStat,

Il titolo "PUNTO DI ROTTURA SIGNIFICATIVO PIÙ RECENTE" tenta di raccontare la storia
IrishStat,

Grazie! Questo è davvero interessante e molto apprezzato. Potrei contattarti per ulteriori dettagli.
whybird,

Grazie per la spiegazione: l'idea è davvero esplicita nell'ultima nota. (per inciso, non ho visto così tanto MAIUSCOLO nell'output del programma dai primi anni '90. Consiglierei di cambiare il "livello di confidenza al 95%" in "livello di significatività del 5%" supponendo che sia quello che si intende.)
Nick Cox

2

Penso che il titolo del thread sia fuorviante: non stai cercando di confrontare le funzioni di densità, ma stai effettivamente cercando interruzioni strutturali in una serie temporale. Tuttavia, non si specifica se si suppone che queste rotture strutturali possano essere trovate in una finestra temporale mobile o col senno di poi osservando la cronologia totale delle serie storiche. In questo senso la tua domanda è in realtà un duplicato di questo: quale metodo per rilevare interruzioni strutturali nelle serie temporali?

Come menzionato da Rob Hyndman in questo link, R offre il pacchetto strucchange a questo scopo. Ho giocato con i tuoi dati ma devo dire che i risultati sono deludenti [il primo punto di dati è davvero 4 o dovrebbe essere 54?]:

raw = c(54,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235)
raw = log(raw+1)
d = as.ts(raw,frequency = 12)
dd = ts.intersect(d = d, d1 = lag(d, -1),d2 = lag(d, -2),d3 = lag(d, -3),d4 = lag(d, -4),d5 = lag(d, -5),d6 = lag(d, -6),d7 = lag(d, -7),d8 = lag(d, -8),d9 = lag(d, -9),d10 = lag(d, -10),d11 = lag(d, -11),d12 = lag(d, -12))

(breakpoints(d ~d1 + d2+ d3+ d4+ d5+ d6+ d7+ d8+ d9+ d10+ d11+ d12, data = dd))
>Breakpoints at observation number:
>151 
>Corresponding to breakdates:
>163 

(breakpoints(d ~d1 + d2, data = dd))
>Breakpoints at observation number:
>95 178 
>Corresponding to breakdates:
>107 190 

Non sono un normale utente del pacchetto. Come puoi vedere dipende dal modello che si adatta ai dati. Puoi sperimentare con

library(forecast)
auto.arima(raw)

che ti dà il modello ARIMA più adatto.


Grazie! Ho eliminato la parola "istogramma" dal titolo; Inizialmente l'avevo usato in modo errato e ho dimenticato di modificare il titolo quando l'ho rimosso dal corpo in una modifica precedente in risposta a un commento.
whybird,

I miei dati sono in realtà una serie di dati spazialmente correlati, non sono basati sul tempo e di solito non esistono su una linea retta o anche su un piano abbastanza spesso - ma hai ragione che a un certo livello fondamentale possono essere considerati nello stesso modo; Immagino che potrebbe essere parte del motivo per cui le mie ricerche precedenti non hanno trovato le risposte che mi aspettavo.
whybird,

Il primo punto di dati in questo esempio è davvero un 4, ma potrebbe anche essere che ci sia capitato di colpire la fine di una struttura precedente o forse era rumore; Sarei felice di lasciarlo fuori come valore anomalo, ma qualunque sistema mi venga in mente dovrà affrontare anche cose del genere.
whybird,

Oh, e l'analisi è col senno di poi. Modificherò la domanda per chiarire.
whybird,
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.