2012-08-07 21 views
8

Ho alcuni set di dati da periodi di tempo simili. È una presentazione di persone in quel giorno, il periodo è di circa un anno. I dati non sono stati raccolti a intervalli regolari, è piuttosto piuttosto casuale: 15-30 voci per ogni anno, da 5 anni diversi.Prevedere dalla data precedente: dati di valore

Il grafico disegnato dai dati per ogni anno si presenta più o meno così: graph Grafico realizzato con matplotlib. Ho i dati nel formato datetime.datetime, int.

È possibile prevedere, in qualsiasi modo ragionevole, come andranno le cose in futuro? Il mio pensiero originale era quello di contare la media di tutte le occorrenze precedenti e prevedere che sarà questo. Ciò, tuttavia, non tiene in considerazione alcun dato dell'anno corrente (se è stato sempre superiore alla media, l'ipotesi dovrebbe probabilmente essere leggermente superiore).

Il set di dati e la mia conoscenza delle statistiche sono limitati, quindi ogni intuizione è utile.

Il mio obiettivo sarebbe quello di creare prima una soluzione prototipo, provare se i miei dati sono sufficienti per quello che sto cercando di fare e dopo la (potenziale) validazione, proverei un approccio più raffinato.

Modifica: Purtroppo non ho mai avuto la possibilità di provare le risposte che ho ricevuto! Sono comunque curioso di sapere se quel tipo di dati sarebbe sufficiente e terrò a mente se ne avrò la possibilità. Grazie per tutte le risposte.

+2

a questa domanda non è realmente di codice, più su matematica, come si definisce la previsione in questo senso? e qual è il modo matematico su questo tipo di curva/grafico? non penso che questo sia il posto giusto per questa domanda. –

+1

@Inbar Sono consapevole che questo non si adatta perfettamente alla sezione del codice, ma è l'unico angolo da cui mi sto avvicinando. Confido che le persone qui abbiano competenze sufficienti per darmi una direzione per la soluzione. – schme

+0

Questa domanda sarebbe più adatta a http://stats.stackexchange.com/ –

risposta

4

La previsione è difficile. Potresti provare a provare polynomial extrapolation - ma l'errore di stima aumenterà drasticamente man mano che ci si allontana dall'area "nota".

Un'altra possibile soluzione sta tentando di utilizzare gli algoritmi machine learning, ma richiede la raccolta di molti dati.

Estrai funzionalità dai tuoi dati (una funzionalità è il numero di voci in un solo giorno, ad esempio). E addestrare l'algoritmo. (Assegnare a dati passati una funzionalità e il presente come campo previsto, ad esempio).

Non conosco Python, ma in Java: esiste una libreria open source denominata weka che implementa la maggior parte delle funzionalità e degli algoritmi utilizzati per l'apprendimento automatico.

È possibile stimare la precisione con cui questo metodo utilizza in seguito cross validation.


Detto questo - questo problema è solitamente indicato come il rilevamento di tendenza, ed è un campo caldo nella ricerca attualmente, così there is no silver bullet.

+0

L'apprendimento automatico ha davvero bisogno di molti dati? Voglio dire, per cose come la regressione lineare, potrebbe non farlo (ho solo fatto un po ', quindi fondamentalmente sto chiedendo) – darkphoenix

+0

@darkphoenix: Dall'esperienza personale - più dati hai - migliori risultati otterrà l'algoritmo. Inoltre, per dimostrare che funziona davvero - lo fai con test statistici. Questi di solito richiedono centinaia o migliaia di istanze classificate. – amit

+2

Per Python, ci sono scikits.learn, credo che tu possa usare anche l'arancione. Entrambi dipendono da Numpy. – darkphoenix

12

Nel tuo caso, i dati cambiano rapidamente e si hanno osservazioni immediate di nuovi dati. È possibile implementare una previsione rapida utilizzando il livellamento esponenziale Holt-winter.

Le equazioni di aggiornamento:

enter image description here

m_t sono i dati che hai, per esempio, il numero di persone in ogni momento t. v_t è la prima derivata, vale a dire la tendenza di m. alpha e beta sono due parametri di decadimento.La variabile con tilde in alto indica il valore previsto. Controlla i dettagli dell'algoritmo nella pagina di wikipedia.

Poiché si utilizza python, è possibile visualizzare alcuni codici di esempio per facilitare l'utilizzo dei dati. A proposito, io uso alcuni dati sintetici come qui sotto:

data_t = range(15) 
data_y = [5,6,15,20,21,22,26,42,45,60,55,58,55,50,49] 

Sopra data_t è una sequenza di punti di dati consecutivi da tempo 0; data_y è una sequenza di numero osservato di persone in ogni presentazione.

I dati sono riportati di seguito (ho cercato di renderlo vicino ai dati).

enter image description here

Il codice per l'algoritmo è semplice.

def holt_alg(h, y_last, y_pred, T_pred, alpha, beta): 
    pred_y_new = alpha * y_last + (1-alpha) * (y_pred + T_pred * h) 
    pred_T_new = beta * (pred_y_new - y_pred)/h + (1-beta)*T_pred 
    return (pred_y_new, pred_T_new) 

def smoothing(t, y, alpha, beta): 
    # initialization using the first two observations 
    pred_y = y[1] 
    pred_T = (y[1] - y[0])/(t[1]-t[0]) 
    y_hat = [y[0], y[1]] 
    # next unit time point 
    t.append(t[-1]+1) 
    for i in range(2, len(t)): 
     h = t[i] - t[i-1] 
     pred_y, pred_T = holt_alg(h, y[i-1], pred_y, pred_T, alpha, beta) 
     y_hat.append(pred_y) 
    return y_hat 

Ok, ora chiamiamolo nostro predittore e tracciare il risultato previsto contro le osservazioni:

import matplotlib.pyplot as plt 
plt.plot(data_t, data_y, 'x-') 
plt.hold(True) 

pred_y = smoothing(data_t, data_y, alpha=.8, beta=.5) 
plt.plot(data_t[:len(pred_y)], pred_y, 'rx-') 
plt.show() 

Il rosso mostra il risultato di previsione ad ogni tempo. Ho impostato alpha in 0,8, in modo che l'osservazione più recente influenzi molto la prossima previsione. Se vuoi dare più peso ai dati storici, gioca solo con i parametri alpha e beta. Inoltre, il punto dati più a destra sulla linea rossa a t=15 è l'ultima previsione, alla quale non abbiamo ancora un'osservazione.

BTW, this è lontano da una previsione perfetta. È solo qualcosa che puoi iniziare velocemente. Uno degli aspetti negativi di questo approccio è che devi essere in grado di ottenere osservazioni, altrimenti la previsione sarebbe sempre più spenta (probabilmente questo è vero per tutte le previsioni in tempo reale). Spero che sia d'aiuto.

enter image description here

Problemi correlati