Itu adalah kepadatan transisi keadaan ( ), yang merupakan bagian dari model Anda dan karenanya dikenal. Anda perlu mengambil sampel dari itu dalam algoritma dasar, tetapi perkiraan mungkin. adalah distribusi proposal dalam kasus ini. Ini digunakan karena distribusi umumnya tidak dapat ditelusuri.xtp(xt|xt−1) p(xt|x0:t−1,y1:t)
Ya, itulah densitas pengamatan, yang juga merupakan bagian dari model, dan karenanya diketahui. Ya, itulah arti normalisasi. Tilde digunakan untuk menandakan sesuatu seperti "pendahuluan": adalah sebelum resampling, dan adalah sebelum renormalisasi. Saya akan menebak bahwa itu dilakukan dengan cara ini sehingga notasi cocok antara varian dari algoritma yang tidak memiliki langkah resampling (yaitu selalu merupakan estimasi akhir). x ˜ w wxx~xw~wx
Tujuan akhir dari filter bootstrap adalah untuk memperkirakan urutan distribusi kondisional (keadaan tidak dapat diobservasi pada , memberikan semua pengamatan sampai ).t tp(xt|y1:t)tt
Pertimbangkan model sederhana:
Xt=Xt−1+ηt,ηt∼N(0,1)
X0∼N(0,1)
Yt=Xt+εt,εt∼N(0,1)
Ini adalah jalan acak yang diamati dengan kebisingan (Anda hanya mengamati , bukan ). Anda dapat menghitung persis dengan filter Kalman, tetapi kami akan menggunakan filter bootstrap atas permintaan Anda. Kita dapat menyatakan kembali model dalam hal distribusi transisi keadaan, distribusi keadaan awal, dan distribusi pengamatan (dalam urutan itu), yang lebih berguna untuk filter partikel:YXp(Xt|Y1,...,Yt)
Xt|Xt−1∼N(Xt−1,1)
X0∼N(0,1)
Yt|Xt∼N(Xt,1)
Menerapkan algoritma:
Inisialisasi. Kami menghasilkan partikel (independen) sesuai dengan .NX(i)0∼N(0,1)
Kami mensimulasikan setiap partikel maju secara mandiri dengan menghasilkan , untuk setiap .X(i)1|X(i)0∼N(X(i)0,1)N
Kami kemudian menghitung kemungkinan , di mana adalah kepadatan normal dengan mean dan varians (kepadatan pengamatan kami). Kami ingin memberi bobot lebih pada partikel yang lebih mungkin menghasilkan pengamatan yang kami rekam. Kami menormalkan bobot ini sehingga jumlahnya 1.w~(i)t=ϕ(yt;x(i)t,1)ϕ(x;μ,σ2)μσ2yt
Kami menguji ulang partikel sesuai dengan bobot ini . Perhatikan bahwa suatu partikel adalah lintasan penuh (yaitu jangan hanya mengulangi titik terakhir, itu keseluruhannya, yang mereka nyatakan sebagai ).wtxx(i)0:t
Kembali ke langkah 2, bergerak maju dengan versi partikel yang di-resampled, sampai kami telah memproses keseluruhan seri.
Implementasi dalam R berikut:
# 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)
Grafik yang dihasilkan:
Tutorial yang bermanfaat adalah yang ditulis oleh Doucet dan Johansen, lihat di sini .