2013-04-30 16 views
5

Ho un set di vettori binari in cui ogni vettore rappresenta un giorno di occupazione in una casa e consiste di 48 elementi (ogni elemento per 30 minuti del giorno). Ogni elemento può essere 1 nel senso che la casa era occupata e 0 in quella non occupata.Prevedere il vettore di occupazione binaria dalla storia dei vettori

Il mio compito è quello di prevedere il giorno successivo in base alla cronologia degli stessi giorni (lunedì dalla cronologia del lunedì ecc.). Finora sto usando la distanza di hamming per trovare 5 giorni più simili nella storia e da loro calcolo le probabilità di occupazione come media di quei 5 numeri. Quando la probabilità è superiore a qualche X, nel mio caso 0.4, prevedo che sia occupata.

Ma c'è sicuramente un modo più efficace per farlo, qualsiasi algoritmo che catturerebbe la tendenza nella storia?

+1

Personalmente userò semplicemente la modalità per trovare lo stato di occupazione più frequente nella cronologia per ogni intervallo di mezz'ora. Se vuoi utilizzare solo gli stati più recenti, prendi solo le loro modalità. Lo offro solo per segnalare che devi decidere quale approccio adottare per la previsione, quindi implementarlo. L'uso di misure complicate come le distanze di Hamming non rende le previsioni migliori se non si ha un solido supporto teorico (o pratico) all'idea che usare la distanza di Hamming sia l'approccio giusto. Lo stesso argomento vale per il mio suggerimento di usare la modalità. –

+0

Fondamentalmente quello che sto facendo qui è prendere il blocco più frequente, ma io uso la distanza di hamming per scegliere i giorni più adatti dai giorni precedenti sulla base dei dati del giorno corrente. Quindi confronto l'inizio della giornata con gli inizi dei giorni precedenti. Quindi c'è un po 'di giustificazione per la distanza di Hamming. Quello che sto cercando di fare è più come creare una giornata tipo o così, questo è ciò che intendo per catturare la tendenza. –

+0

ulteriori informazioni potrebbero essere utili, ad esempio, la natura dell'occupazione o se le stagioni/alcuni mesi dell'anno potrebbero avere modelli prevedibili. –

risposta

0

Probabilmente si desidera solo salvare i giorni N più recenti e/o assegnare un peso maggiore ai giorni più recenti. Altrimenti l'algoritmo non risponderà abbastanza velocemente a un cambiamento nelle abitudini dell'utente.

È inoltre possibile ottenere risultati migliori se si confronta l'occupazione per intervalli piuttosto che per vettori bit: in genere una casa sarà occupata/non occupata per un ampio intervallo di tempo, piuttosto che ad es. occupazione alternata ogni mezz'ora. Questo è particolarmente vero nei giorni feriali, dove la casa non sarà occupata per otto (o nove, o dieci) ore a partire dalla mattina e fino alla sera; l'intervallo di occupazione al mattino sarà un buon indicatore dell'intervallo di occupazione di metà giornata, poiché se l'occupante si allontana per lavoro presto o tardi, probabilmente andrà a casa presto o tardi. Se sono ancora a casa alle 10:00 o alle 11:00, probabilmente staranno a casa tutto il giorno (a causa di malattia o in vacanza). È anche facile confrontare e indicizzare gli intervalli rispetto ai vettori bit: ad esempio, è possibile memorizzare i giorni in uno interval tree (o piuttosto in un albero ad intervalli convertito in una treemap), con l'intervallo come chiave e il giorno/i come valore, al fine di determinare rapidamente quali giorni condividono l'intervallo di occupazione mattutina del giorno corrente.

Avrete bisogno di due strutture dati: una serie di alberi intervallati (mappe), un albero per giorno della settimana, che utilizza l'intervallo di occupazione mattutino come chiave e un insieme di giorni precedenti come valore. Questa raccolta dovrà aggregare gli intervalli di occupazione serale; l'occupazione prevista per un dato periodo di mezz'ora è la modalità dei giorni precedenti che hanno lo stesso intervallo di occupazione mattutino (quindi se hai memorizzato 7 giorni e 5 di essi prevedono l'occupazione al tempo X, allora la struttura dati prevede l'occupazione al momento X). Avrai anche bisogno di una coda di tutti i giorni precedenti, in modo da poter rimuovere i giorni più vecchi dagli alberi degli intervalli. (In alternativa, assegnare un peso maggiore ai giorni più recenti, tuttavia è più difficile da implementare, poiché è necessario ridurre anche i pesi dei giorni precedenti.)

Potresti scoprire che hai bisogno solo di due alberi ad intervalli, uno per i giorni feriali e uno per i fine settimana.

1

Il tuo approccio sembra abbastanza ragionevole (si chiama K-neighbor neighbor o KNN), anche se non sono sicuro che tu stia usando la giusta metrica di distanza (distanza di hamming finora in questo giorno). Il tuo metodo è abbastanza sensibile alla struttura precisa di un giorno e probabilmente impiegherà molto tempo per adattarsi a cose come le vacanze, pur essendo ipersensibile nelle prime diverse ore di un giorno.

Un'alterazione del metodo che proverò è quella di guardare le 24 ore precedenti anziché "fino ad oggi" o utilizzare entrambi i metodi e calcolare la media dei risultati. Ad esempio, il precedente metodo di 24 ore si riprendeva abbastanza rapidamente in una vacanza, ma il metodo così lontano potrebbe perdere una vacanza se l'utente non ha mai avuto un giorno di ferie il mercoledì o qualcosa del genere. Questo è un concetto simile a questo gioco rock paper scissors, che guarda i tuoi ultimi quattro lanci per prevedere quello successivo.

Un'altra modifica che considererei è quella di giocare con i pesi nel calcolo della distanza di hamming. Ad esempio, pesate la corrispondenza di ogni bit per lambda^(-n), dove lambda è un parametro che è possibile regolare (iniziare con qualcosa come 1.1) e n indica il numero di ore nel passato rappresentato dal bit.

Qualsiasi di vari algoritmi di classificazione, come SVM, regressione logistica, foreste casuali, ecc. Dovrebbe funzionare anche abbastanza bene. Caratteristiche da aggiungere al vettore di feature:

  • giorno della settimana
  • ora
  • occupazione media quest'ora
  • occupazione media oggi
  • occupazione media questo (giorno, ora)
  • passato occupazione N-grammi (cioè il vettore bit delle precedenti N ore) per vari valori di N
  • è una vacanza?
  • ore dal sorgere del sole

Infine, per un nuovo utente, sarà probabilmente un po 'per ottenere i dati di allenamento abbastanza, così si potrebbe desiderare di avere due modelli: un modello globale in base a tutti gli utenti e un modello utente individuale. È quindi possibile pesare le uscite dei due modelli, con il peso sul modello utente in aumento

+0

Sono d'accordo con il commento sulla distanza di hamming che è abbastanza sensibile alla struttura precisa della giornata. Io non seguo leggermente il modo in cui il 'lambda^(- n)' migliorerebbe quello, in pratica quello che fa è diminuire il peso delle ore man mano che arrivano durante il giorno. Guardare indietro alle 24 ore è una buona idea che darò un'occhiata a questo. Per quanto riguarda i classificatori li ho già utilizzati in diverse applicazioni, ma non sono sicuro di come usarli in un ambiente continuo. Significherebbe addestrarli di nuovo ogni mezz'ora? Praticamente, no? –

+0

'n' dovrebbe essere il numero di ore prima del presente. In questo modo i due periodi corrispondenti a -10 ore sono meno significativi di due periodi corrispondenti a -1 ore.Ad esempio se sono le 11:00, una differenza alle 10 è molto più significativa di una differenza all'1 di notte. Non penso che avresti bisogno di un modello diverso per ogni ora del giorno. È sufficiente includere ogni 1/2 ora come caratteristica binaria nel vettore di funzionalità (48 funzioni in totale). un classificatore ad albero decisionale baserà fondamentalmente un modello separato per ogni mezz'ora se determina che è la cosa migliore da fare. – RecursivelyIronic

Problemi correlati