Bu, modelinizin bir parçası olan ve bu nedenle bilinen durumun ( ) geçiş yoğunluğudur . Temel algoritmada örneklemeniz gerekir, ancak tahminler mümkündür. olan , bu durumda teklifi dağılımı. Bu dağıtım için kullanılır genelde uysal değildir.xtp(xt|xt−1) p(xt|x0:t−1,y1:t)
Evet, bu da modelin bir parçası olan ve bu nedenle bilinen gözlem yoğunluğu. Evet, normalleşmenin anlamı budur. Tilde "ön" gibi bir şey belirtmek için kullanılır: ise yeniden örnekleme önce ve olduğu renormalize önce. Gösterimin, bir yeniden örnekleme adımı olmayan algoritmanın varyantları arasında eşleşmesi için bu şekilde yapıldığını tahmin ediyorum (yani her zaman nihai tahmindir).x~xw~wx
Önyükleme filtrenin nihai amacı koşullu dağılımlar dizisini tahmin etmektir (en gözlenemeyen halde kadar tüm gözlemler verilen, ).p(xt|y1:t)tt
Basit modeli düşünün:
Xt=Xt−1+ηt,ηt∼N(0,1)
X0∼N(0,1)
Yt=Xt+εt,εt∼N(0,1)
Bu, gürültü ile gözlemlenen rastgele bir yürüyüştür ( değil, sadece gözlemlersiniz ). Sen hesaplayabilir Kalman filtresi ile tam olarak, ama biz isteğiniz üzerine önyükleme filtresi kullanacağız. Modeli, partikül filtresi için daha yararlı olan durum geçiş dağılımı, ilk durum dağılımı ve gözlem dağılımı (bu sırayla) açısından yeniden ifade edebiliriz:YXp(Xt|Y1,...,Yt)
Xt|Xt−1∼N(Xt−1,1)
X0∼N(0,1)
Yt|Xt∼N(Xt,1)
Algoritmayı uygulama:
Başlatma. Biz oluşturmak göre (bağımsız) parçacıkları .NX(i)0∼N(0,1)
Her bir parçacığı üreterek bağımsız olarak ileriye doğru simüle ediyoruzHer bir için .X(i)1|X(i)0∼N(X(i)0,1)N
Bu o zaman, uygunluk hesaplamak , burada olduğu ortalama ve varyans ile normal yoğunluk (gözlem yoğunluğumuz). gözlemini üretme olasılığı daha yüksek olan parçacıklara daha fazla ağırlık vermek istiyoruz . Bu ağırlıkları normalleştiriyoruz, böylece toplamları 1.w~(i)t=ϕ(yt;x(i)t,1)ϕ(x;μ,σ2)μσ2yt
Partikülleri bu ağırlıklara göre yeniden . Bir parçacığın tam bir yolu olduğuna dikkat edin (yani yalnızca son noktayı yeniden örneklemeyin, olarak ifade ettikleri her şey ).wtxx(i)0:t
Tüm seriyi işleyene kadar parçacıkların yeniden örneklenmiş versiyonu ile ilerleyerek 2. adıma geri dönün.
R'deki bir uygulama şu şekildedir:
# 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)
Ortaya çıkan grafik:
Yararlı bir öğretici Doucet ve Johansen tarafından verilen öğreticidir, buraya bakın .