Đó là mật độ chuyển tiếp của trạng thái ( ), là một phần của mô hình của bạn và do đó được biết đến. Bạn cần phải lấy mẫu từ nó trong thuật toán cơ bản, nhưng gần đúng là có thể. p ( x t | x t - 1 ) là phân phối đề xuất trong trường hợp này. Nó được sử dụng vì phân phối p ( x t | x 0 : t - 1 , y 1 : t ) thường không thể kéo được.xtp(xt|xt−1) p(xt|x0:t−1,y1:t)
Vâng, đó là mật độ quan sát, cũng là một phần của mô hình, và do đó được biết đến. Vâng, đó là những gì bình thường hóa có nghĩa. Dấu ngã được sử dụng để biểu thị một cái gì đó như "sơ bộ": là x trước khi lấy mẫu lại và ˜ w là w trước khi tái chuẩn hóa. Tôi đoán rằng nó được thực hiện theo cách này để ký hiệu khớp với các biến thể của thuật toán không có bước lấy mẫu lại (tức là x luôn là ước tính cuối cùng).x~xw~wx
p(xt|y1:t)tt
Hãy xem xét mô hình đơn giản:
Xt=Xt−1+ηt,ηt∼N(0,1)
X0∼N(0,1)
Yt=Xt+εt,εt∼N(0,1)
YXp(Xt|Y1,...,Yt)
Xt|Xt−1∼N(Xt−1,1)
X0∼N(0,1)
Yt|Xt∼N(Xt,1)
Áp dụng thuật toán:
NX(i)0∼N(0,1)
X(i)1|X(i)0∼N(X(i)0,1)N
w~(i)t=ϕ(yt;x(i)t,1)ϕ(x;μ,σ2)μσ2yt
wtxx(i)0:t
Quay trở lại bước 2, tiến về phía trước với phiên bản được ghép lại của các hạt, cho đến khi chúng tôi xử lý toàn bộ chuỗi.
Một triển khai trong R như sau:
# 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)
Biểu đồ kết quả:
Một hướng dẫn hữu ích là một của Doucet và Johansen, xem tại đây .