Filtro de inicialização / algoritmo de filtro de partículas (Noções básicas)


12

Eu realmente tenho uma falta de entendimento de como o filtro de autoinicialização funciona. Conheço os conceitos aproximadamente, mas não consigo apreender certos detalhes. Esta pergunta é para eu esclarecer a desordem. Aqui vou usar esse algoritmo de filtro popular a partir de uma referência por doucet (até agora acho que essa é a referência mais fácil). Deixe-me primeiro dizer-lhe que meu problema é entender quais distribuições são conhecidas e quais são desconhecidas.

filtro de autoinicialização

Estas são as minhas perguntas:

  1. Em 2), qual é a distribuição ? Essa distribuição é conhecida ? Conhecemos essa distribuição para todos os t ? Se sim, mas e se não pudermos provar? É engraçado que eles chamam essa etapa de amostragem de importância, mas não vejo distribuição de proposta.p(xt|xt-1(Eu))t
  2. Também em 2) uma distribuição conhecida ? "Normalizar pesos de importância significa w ( i ) t = ˜ w ( i )p(yt|x~t(Eu)) ? O que o til emxWt(Eu)=W~t(Eu)Eu=1NW~t(Eu)x e ? Significa algo como não amostrado ou não normalizado, respectivamente?W
  3. Eu apreciaria se alguém pudesse dar um exemplo simples de brinquedo usando distribuições conhecidas para usar esse filtro de inicialização. O objetivo final do filtro de autoinicialização não está claro para mim.

Respostas:


10
  1. Essa é a densidade de transição do estado ( ), que faz parte do seu modelo e, portanto, é conhecido. Você precisa fazer uma amostra dele no algoritmo básico, mas são possíveis aproximações. p ( x t | x t - 1 ) é a distribuição da proposta nesse caso. É usado porque a distribuição p ( x t | x 0 : t - 1 , y 1 : t )xtp(xt|xt-1) p(xt|x0 0:t-1,y1:t) geralmente não é tratável.

  2. Sim, essa é a densidade de observação, que também faz parte do modelo e, portanto, é conhecida. Sim, é isso que significa normalização. O til é usado para significar algo como "preliminar": é x antes de reamostragem, e ~ w é w antes de renormalização. Eu acho que isso é feito dessa maneira para que a notação corresponda entre as variantes do algoritmo que não possuem uma etapa de reamostragem (ou seja, xx~xW~Wx é sempre a estimativa final).

  3. O objetivo final do filtro de autoinicialização é estimar a sequência de distribuições condicionais (o estado não observável em t , considerando todas as observações até t ).p(xt|y1:t)tt

Considere o modelo simples:

X 0N ( 0 , 1 ) Y t = X t + ε t ,

Xt=Xt-1+ηt,ηtN(0 0,1)
X0 0N(0 0,1)
Yt=Xt+εt,εtN(0 0,1)

YXp(Xt|Y1,...,Yt) exatamente com o filtro de Kalman, mas vamos usar o filtro de inicialização em seu pedido. Podemos reformular o modelo em termos de distribuição de transição de estado, distribuição inicial de estado e distribuição de observação (nessa ordem), que é mais útil para o filtro de partículas:

Xt|Xt-1N(Xt-1,1)
X0 0N(0 0,1)
Yt|XtN(Xt,1)

Aplicando o algoritmo:

  1. NX0 0(Eu)N(0 0,1) .

  2. X1(Eu)|X0 0(Eu)N(X0 0(Eu),1)N .

    W~t(Eu)=ϕ(yt;xt(Eu),1)ϕ(x;μ,σ2)μσ2yt

  3. Wt. Observe que uma partícula é um caminho completo dex (ou seja, não basta redimensionar o último ponto, é a coisa toda, que eles denotam como x0 0:t(Eu))

Volte para a etapa 2, avançando com a versão reamostrada das partículas, até processarmos toda a série.

Uma implementação em R segue:

# 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)

O gráfico resultante:insira a descrição da imagem aqui

Um tutorial útil é o de Doucet e Johansen, veja aqui .


Para seu ponto 2) na aplicação do algoritmo X1(Eu)|X0 0(Eu)N(0 0,1)-> X1(Eu)|X0 0(Eu)N(X0 0(Eu),1)?? Muito obrigado. Eu tenho um filtro de bootstrap funcional nesse modelo. Obrigado pela ênfase em reamostrar os caminhos e não apenas as t-ésimas partículas.
tintinthong 29/09/16

Correto, corrigi o erro de digitação #
Chris Haug

Os caminhos não precisam ser amostrados novamente? De outra literatura, não há necessidade de provar os caminhos. Eu só preciso provar as partículas a cada passo do tempo. Eu queria saber se existe uma razão para reamostragem os caminhos
tintinthong
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.