Filtri antiparticolato: come fare il ricampionamento?


24

Comprendo il principio di base di un filtro antiparticolato e ho cercato di implementarlo. Tuttavia, mi sono bloccato sulla parte di ricampionamento.

Teoricamente parlando, è abbastanza semplice: dal vecchio (e ponderato) insieme di particelle, disegna un nuovo insieme di particelle con la sostituzione. Nel fare ciò, favorisci quelle particelle che hanno pesi elevati. Le particelle con pesi elevati vengono disegnate più spesso e le particelle con pesi bassi meno spesso. Forse solo una volta o per niente. Dopo il ricampionamento, a tutti i pesi viene assegnato lo stesso peso.

La mia prima idea su come implementare questo era essenzialmente questa:

  1. Normalizza i pesi
  2. Moltiplicare ciascun peso per il numero totale di particelle
  3. Arrotonda quei pesi in scala all'intero più vicino (ad es. Con int()in Python)

Ora dovrei sapere con quale frequenza disegnare ogni particella, ma a causa degli errori di arrotondamento, finisco per avere meno particelle rispetto a prima del passaggio di ricampionamento.

La domanda: come faccio a "riempire" le particelle mancanti per arrivare allo stesso numero di particelle di prima della fase di ricampionamento? Oppure, nel caso in cui io sia completamente fuori strada qui, come posso ricampionare correttamente?

Risposte:


19

Il problema che stai riscontrando viene spesso definito impoverimento del campione. Possiamo vedere perché il tuo approccio ne soffre con un esempio abbastanza semplice. Supponiamo che tu abbia 3 particelle e i loro pesi normalizzati siano 0,1, 0,1, 0,8. Quindi moltiplicando per ciascun peso per i 3 si ottengono 0,3, 0,3 e 2,4. Quindi l'arrotondamento produce 0, 0, 2. Ciò significa che non sceglieresti le prime due particelle e l'ultima verrebbe raccolta due volte. Ora sei giù a due particelle. Sospetto che questo sia quello che hai visto quando hai detto "a causa degli errori di arrotondamento, finisco per avere meno particelle".

Un metodo di selezione alternativo sarebbe il seguente.

  1. Normalizzare i pesi.
  2. Calcola una matrice della somma cumulativa dei pesi.
  3. Generare casualmente un numero e determinare quale intervallo in quell'array di pesi cumulativo a cui appartiene il numero.
  4. L'indice di quell'intervallo corrisponderebbe alla particella che dovrebbe essere creata.
  5. Ripetere fino ad ottenere il numero desiderato di campioni.

Quindi, usando l'esempio sopra, inizieremmo con i pesi normalizzati. Vorremmo quindi calcolare l'array [0.1, 0.2, 1]. Da lì calcoliamo 3 numeri casuali diciamo 0,15, 0,38 e 0,54. Questo ci farebbe scegliere una volta la seconda particella e la terza particella due volte. Il punto è che dà alle particelle più piccole la possibilità di propagarsi.

Una cosa da notare è che mentre questo metodo affronterà l'impoverimento può portare a soluzioni non ottimali. Ad esempio, è possibile che nessuna delle particelle corrisponda davvero bene alla tua posizione (supponendo che tu lo stia usando per la localizzazione). I pesi indicano solo quali particelle corrispondono meglio, non la qualità della corrispondenza. Pertanto, quando si eseguono letture aggiuntive e si ripete il processo, è possibile che tutte le particelle si raggruppino in un'unica posizione che non sia quella corretta. Questo di solito è perché non c'erano particelle buone per iniziare.


1
Grazie per la risposta perspicace! Il metodo di selezione che hai suggerito sembra familiare. Se ricordo bene, quello era un modo comune di trattare il problema dell'impoverimento del campione. L'ho visto prima ma non ho mai veramente capito il motivo di questa procedura. Adesso lo so meglio!
Daniel Eberts,

2
Penso che la tua interpretazione dell'impoverimento del campionamento possa essere un po 'fuorviante. Il fatto che il poster perda particelle è dovuto a un metodo inadatto per il ricampionamento. L'impoverimento delle particelle si verifica quando la distribuzione posteriore non è più adeguatamente rappresentata dalle particelle.
Jakob

9

Come immagino tu abbia scoperto, il metodo di ricampionamento che stai proponendo è leggermente imperfetto, in quanto non dovrebbe alterare il numero di particelle (a meno che tu non voglia). Il principio è che il peso rappresenta la probabilità relativa rispetto alle altre particelle. Nella fase di ricampionamento, si disegna dall'insieme di particelle in modo tale che per ogni particella, il peso normalizzato per il numero di particelle rappresenti il ​​numero di volte in cui la particella viene disegnata in media. In questo la tua idea è corretta. Solo usando l'arrotondamento anziché il campionamento, eliminerai sempre le particelle per le quali il valore atteso è inferiore alla metà.

Esistono diversi modi per eseguire correttamente il ricampionamento. C'è un bel documento chiamato sugli algoritmi di ricampionamento per i filtri antiparticolato , che confronta i diversi metodi. Giusto per dare una rapida panoramica:

  • Ricampionamento multinomiale: immagina una striscia di carta in cui ogni particella ha una sezione, in cui la lunghezza è proporzionale al suo peso. Scegli casualmente una posizione sulla striscia N volte e scegli la particella associata alla sezione.

  • Ricampionamento residuo: questo approccio cerca di ridurre la varianza del campionamento, allocando prima ogni particella il loro intero numero del valore atteso e lasciando il resto al ricampionamento multinomiale. Ad esempio, una particella con un valore atteso di 2,5 avrà 2 copie nel set ricampionato e un'altra con un valore atteso di 0,5.

  • Ricampionamento sistematico: prendi un righello con segni regolari distanziati, in modo che i segni N abbiano la stessa lunghezza della tua striscia di carta. Posiziona casualmente il righello accanto alla tua striscia. Prendi le particelle sui segni.

  • Ricampionamento stratificato: uguale al ricampionamento sistematico, tranne per il fatto che i segni sul righello non sono posizionati in modo uniforme, ma aggiunti come campionamenti di processi casuali N dall'intervallo 0..1 / N.

Quindi, per rispondere alla tua domanda: ciò che hai implementato potrebbe essere esteso a una forma di campionamento residuo. Riempi gli slot mancanti campionando in base a una distribuzione multinoniale dei promemoria.


+1 per aver già risposto alla mia domanda di follow-up :)
Daniel Eberts,

5

Per un esempio di codice Python che implementa correttamente il ricampionamento, potresti trovare utile questo progetto github: https://github.com/mjl/particle_filter_demo

Inoltre, viene fornito con una propria rappresentazione visiva del processo di ricampionamento, che dovrebbe aiutarti a eseguire il debug della tua implementazione. Funzionamento del filtro antiparticolato

In questa visualizzazione, la tartaruga verde mostra la posizione effettiva, il grande punto grigio mostra la posizione stimata e diventa verde quando converge. Il peso va da probabile (rosso) a improbabile (blu).


Grazie per il link È sempre perspicace vedere come le altre persone hanno implementato un algoritmo.
Daniel Eberts,

Questa è una visualizzazione di un filtro antiparticolato convergente. Non sono sicuro di quale intuizione fornisca rispetto alla domanda.
Jakob,

Ho incluso la visualizzazione poiché è ciò che viene prodotto dal codice che ho pubblicato, un esempio di come implementare correttamente il ricampionamento.
Ian,

1

un modo semplice per farlo è numpy.random.choice (N, N, p = w, sostituisci = Vero) dove N è il no. di particelle e w = pesi normalizzati.


Benvenuto in Robotica , narayan. Potresti per favore espandere questa risposta un po '? Ad esempio, perché usare una scelta casuale? Cosa c'è pnella tua funzione? Più dettagliata è la risposta, più utile sarà per i futuri visitatori che hanno lo stesso problema.
Chuck

1

Uso l'approccio di @ narayan per implementare il mio filtro antiparticolato:

new_sample = numpy.random.choice(a=particles, size=number_of_particles, replace=True, p=importance_weights)

a è il vettore delle particelle da campionare, dimensione è il conteggio delle particelle e p è il vettore dei loro pesi normalizzati. replace = True gestisce il campionamento bootstrap con la sostituzione. Il valore restituito è un vettore di nuovi oggetti particella.

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.