それは状態の遷移密度()であり、これはモデルの一部であり、したがって既知です。基本的なアルゴリズムでそれからサンプリングする必要がありますが、近似が可能です。p (x t | x t − 1)は、この場合の提案分布です。分布p (x t | x 0 :t − 1、y 1 :t)は一般に扱いにくいために使用されます。バツtp (xt| バツt − 1) p (xt| バツ0 :t − 1、y1 :t)
はい、それは観測密度であり、これもモデルの一部であり、したがって既知です。はい、それが正規化の意味です。チルダは、のようなものを意味するために使用される「予備」: であるXリサンプリングの前に、と〜wがあるwの繰り込み前。リサンプリングステップを持たないアルゴリズムのバリアント間で表記法が一致するように、この方法で行われると思います(つまり、xは常に最終的な推定値です)。バツ〜バツw〜wバツ
ブートストラップフィルタの最終目標は、条件付き分布のシーケンス推定することである(にて観察不能な状態Tまで、すべての観測値を与えられ、Tは)。p (xt| y1 :t)tt
単純なモデルを考えてみましょう。
バツt= Xt − 1+ ηt、ηt〜N(0 、1 )
YのT = X T + ε T、バツ0〜N(0 、1 )
Yt= Xt+ εt、εt〜N(0 、1 )
これは、ノイズのあるランダムウォークです(Xではなくのみが観察されます)Yバツ)。あなたは計算することができ正確にカルマンフィルタで、私たちはあなたの要求に応じて、ブートストラップ・フィルタを使用します。状態遷移分布、初期状態分布、および観測分布(この順序で)の観点からモデルを再記述できます。これは、粒子フィルターにとってより便利です。p (Xt| Y1、。。。、Yt)
X 0〜N (0 、1 )のY T | X T〜N (Xのトン、1 )
バツt| バツt − 1〜N(Xt − 1、1 )
バツ0〜N(0 、1 )
Yt| バツt〜N(Xt、1 )
アルゴリズムの適用:
初期化。我々が生成する粒子を(独立に)に係るX (I ) 0〜N (0 、1 )。Nバツ(i )0〜N(0 、1 )
私たちは、生成することにより、独立して前方に各粒子をシミュレートバツ(i )1| バツ(i )0〜N(X(i )0、1 )N
w〜(i )t= ϕ (yt; バツ(i )t、1 )ϕ (x ; μ 、σ2)μσ2yt
wtバツバツ(i )0 :t
シリーズ全体を処理するまで、リサンプリングされたパーティクルを使用して、手順2に戻ります。
Rの実装は次のとおりです。
# 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)
結果のグラフ:
有用なチュートリアルはDoucetとJohansenによるものです。こちらをご覧ください。