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 : t - 1, y1 : t) geralmente não é tratável.
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).
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 0 ∼ N ( 0 , 1 ) Y t = X t + ε t ,
Xt= Xt - 1+ ηt,ηt∼N( 0 , 1 )
X0 0∼N( 0 , 1 )
Yt= Xt+ εt,εt∼N( 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 - 1∼N( Xt - 1, 1 )
X0 0∼N( 0 , 1 )
Yt| Xt∼N( Xt, 1 )
Aplicando o algoritmo:
NX( I )0 0∼N( 0 , 1 ) .
X( I )1| X( I )0 0∼N( X( I )0 0, 1 )N .
W~( I )t= ϕ ( yt; x( I )t, 1 )ϕ ( x ; μ , σ2)μσ2yt
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 x( I )0 : t)
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:
Um tutorial útil é o de Doucet e Johansen, veja aqui .