Filtro Bootstrap / Algoritmo filtro particelle (Comprensione)


12

Ho davvero una mancanza di comprensione di come funziona il filtro bootstrap. Conosco approssimativamente i concetti, ma non riesco a cogliere alcuni dettagli. Questa domanda è per me chiarire il disordine. Qui userò questo popolare algoritmo di filtro da un riferimento di doucet (finora penso che questo sia il riferimento più semplice). Consentitemi innanzitutto di dirvi che il mio problema è capire quali distribuzioni sono note e quali sconosciute.

filtro bootstrap

Queste sono le mie domande:

  1. In 2), qual è la distribuzione ? Questa distribuzione è nota ? Conosciamo questa distribuzione per tutte le ? Se è così, ma cosa succede se non possiamo provarlo? È divertente chiamano questo importante passaggio di campionamento, ma non vedo alcuna distribuzione della proposta.tp(xt|xt1(i))t
  2. Anche in 2) una distribuzione nota ? "Normalizzare pesi di importanza significa ? che cosa significa la tilde su e media? fa qualcosa di dire, come non-ricampionato o non-normalizzato, rispettivamente?w ( i ) t = ˜ w ( i ) tp(yt|x~t(i)) xwwt(i)=w~t(i)i=1Nw~t(i)xw
  3. Gradirei se qualcuno potesse dare un semplice esempio giocattolo usando distribuzioni ben note per utilizzare questo filtro bootstrap. L'obiettivo finale del filtro bootstrap non mi è chiaro.

Risposte:


10
  1. Questa è la densità di transizione dello stato ( ), che fa parte del modello e quindi nota. È necessario campionarlo dall'algoritmo di base, ma sono possibili approssimazioni. è la distribuzione della proposta in questo caso. Viene utilizzato perché la distribuzione è generalmente trattabile.xtp(xt|xt1) p(xt|x0:t1,y1:t)

  2. Sì, questa è la densità di osservazione, che è anche parte del modello e quindi nota. Sì, questo è ciò che significa normalizzazione. La tilde è usata per indicare qualcosa come "preliminare": è prima del ricampionamento e è prima della rinormalizzazione. Immagino che sia fatto in questo modo in modo che la notazione corrisponda tra le varianti dell'algoritmo che non hanno un passo di ricampionamento (cioè è sempre la stima finale).x~xw~wx

  3. L'obiettivo finale del filtro bootstrap è quello di stimare la sequenza di distribuzioni condizionale (lo stato non osservabile in , in tutte le osservazioni fino ).p(xt|y1:t)tt

Considera il modello semplice:

Xt=Xt1+ηt,ηtN(0,1)
X0N(0,1)
Yt=Xt+εt,εtN(0,1)

Questa è una camminata casuale osservata con il rumore (osservi solo , non ). Puoi calcolare esattamente con il filtro Kalman, ma su richiesta useremo il filtro bootstrap. Possiamo riaffermare il modello in termini di distribuzione della transizione di stato, distribuzione di stato iniziale e distribuzione di osservazione (in quell'ordine), che è più utile per il filtro antiparticolato:YXp(Xt|Y1,...,Yt)

Xt|Xt1N(Xt1,1)
X0N(0,1)
Yt|XtN(Xt,1)

Applicazione dell'algoritmo:

  1. Inizializzazione. Generiamo particelle (indipendentemente) secondo .NX0(i)N(0,1)

  2. Simuliamo ogni particella in avanti indipendentemente generando , per ogni .X1(i)|X0(i)N(X0(i),1)N

    Quindi calcoliamo la probabilità , dove è il densità normale con media e varianza (la nostra densità di osservazione). Vogliamo dare più peso alle particelle che hanno maggiori probabilità di produrre l'osservazione che abbiamo registrato. Normalizziamo questi pesi in modo che si sommino a 1.w~t(i)=ϕ(yt;xt(i),1)ϕ(x;μ,σ2)μσ2yt

  3. Ricampioniamo le particelle secondo questi pesi . Nota che una particella è un percorso completo di (cioè non ricampiona solo l'ultimo punto, è l'intera cosa, che denotano come ).wtxx0:t(i)

Torna al passaggio 2, andando avanti con la versione ricampionata delle particelle, fino a quando non abbiamo elaborato l'intera serie.

Segue un'implementazione in R:

# Simulate some fake data
set.seed(123)

tau <- 100
x <- cumsum(rnorm(tau))
y <- x + rnorm(tau)

# Begin particle filter
N <- 1000
x.pf <- matrix(rep(NA,(tau+1)*N),nrow=tau+1)

# 1. Initialize
x.pf[1, ] <- rnorm(N)
m <- rep(NA,tau)
for (t in 2:(tau+1)) {
  # 2. Importance sampling step
  x.pf[t, ] <- x.pf[t-1,] + rnorm(N)

  #Likelihood
  w.tilde <- dnorm(y[t-1], mean=x.pf[t, ])

  #Normalize
  w <- w.tilde/sum(w.tilde)

  # NOTE: This step isn't part of your description of the algorithm, but I'm going to compute the mean
  # of the particle distribution here to compare with the Kalman filter later. Note that this is done BEFORE resampling
  m[t-1] <- sum(w*x.pf[t,])

  # 3. Resampling step
  s <- sample(1:N, size=N, replace=TRUE, prob=w)

  # Note: resample WHOLE path, not just x.pf[t, ]
  x.pf <- x.pf[, s]
}

plot(x)
lines(m,col="red")

# Let's do the Kalman filter to compare
library(dlm)
lines(dropFirst(dlmFilter(y, dlmModPoly(order=1))$m), col="blue")

legend("topleft", legend = c("Actual x", "Particle filter (mean)", "Kalman filter"), col=c("black","red","blue"), lwd=1)

Il grafico risultante:inserisci qui la descrizione dell'immagine

Un tutorial utile è quello di Doucet e Johansen, vedi qui .


Per il tuo punto 2) nell'applicare l'algoritmo -> ?? Grazie mille. Ho un filtro bootstrap funzionante sotto questo modello. Grazie per l'enfasi sul ricampionamento dei percorsi e non solo sulle particelle t-esime. X ( i ) 1 | X ( i ) 0N ( X ( i ) 0 , 1 )X1(i)|X0(i)N(0,1)X1(i)|X0(i)N(X0(i),1)
tintinthong,

Esatto, ho corretto l'errore di battitura
Chris Haug,

Non è necessario ricampionare i percorsi vero ?? Da altra letteratura, non è necessario campionare i percorsi. Devo solo campionare le particelle in ogni fase. Mi chiedevo se c'è un motivo per ricampionare i percorsi
tintinthong
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.