ブートストラップフィルター/粒子フィルターアルゴリズム(理解)


12

ブートストラップフィルターがどのように機能するかについて、本当に理解が不足しています。私はおおまかに概念を知っていますが、特定の詳細を把握できません。この質問は、混乱を解消するためのものです。ここでは、doucetのリファレンスからこの人気のあるフィルターアルゴリズムを使用します(これまでのところ、これが最も簡単なリファレンスだと思います)。私の問題は、どの分布が既知であり、どの分布が未知であるかを理解していることです。

ブートストラップフィルター

これらは私の質問です:

  1. 2)では、分布何ですか?この分布は知られていますか?すべてのtについてこの分布を知っていますか?もしそうなら、しかしそれからサンプリングできない場合はどうでしょうか?彼らがこの重要性のサンプリングステップと呼んでいるのは面白いが、提案の分布は見られない。pバツt|バツt1t
  2. また)2である、既知の分布は?「ノーマライズ重要度重み手段に W I 、T = W I トンpyt|バツtxwのチルダはどういう意味ですか?それぞれ、リサンプリングされていない、または正規化されていないようなものですか?wt=wt=1Nwtバツw
  3. よく知られているディストリビューションを使用してこのブートストラップフィルターを使用する簡単なおもちゃの例を提供できれば幸いです。ブートストラップフィルターの最終目標は明確ではありません。

回答:


10
  1. それは状態の遷移密度()であり、これはモデルの一部であり、したがって既知です。基本的なアルゴリズムでそれからサンプリングする必要がありますが、近似が可能です。p x t | x t 1、この場合の提案分布です。分布p x t | x 0 t 1y 1 tは一般に扱いにくいために使用されます。バツtpバツt|バツt1 pバツt|バツ0t1y1t

  2. はい、それは観測密度であり、これもモデルの一部であり、したがって既知です。はい、それが正規化の意味です。チルダは、のようなものを意味するために使用される「予備」: であるXリサンプリングの前に、とwがあるwの繰り込み前。リサンプリングステップを持たないアルゴリズムのバリアント間で表記法が一致するように、この方法で行われると思います(つまり、xは常に最終的な推定値です)。バツバツwwバツ

  3. ブートストラップフィルタの最終目標は、条件付き分布のシーケンス推定することである(にて観察不能な状態Tまで、すべての観測値を与えられ、Tは)。pバツt|y1ttt

単純なモデルを考えてみましょう。

バツt=バツt1+ηtηtN01
YのT = X T + ε T
バツ0N01
Yt=バツt+εtεtN01

これは、ノイズのあるランダムウォークです(Xではなくのみが観察されます)Yバツ)。あなたは計算することができ正確にカルマンフィルタで、私たちはあなたの要求に応じて、ブートストラップ・フィルタを使用します。状態遷移分布、初期状態分布、および観測分布(この順序で)の観点からモデルを再記述できます。これは、粒子フィルターにとってより便利です。pバツt|Y1Yt

X 0N 0 1 のY T | X TN Xのトン1

バツt|バツt1Nバツt11
バツ0N01
Yt|バツtNバツt1

アルゴリズムの適用:

  1. 初期化。我々が生成する粒子を(独立に)に係るX I 0N 0 1 Nバツ0N01

  2. 私たちは、生成することにより、独立して前方に各粒子をシミュレートバツ1|バツ0Nバツ01N

    wt=ϕyt;バツt1ϕバツ;μσ2μσ2yt

  3. wtバツバツ0t

シリーズ全体を処理するまで、リサンプリングされたパーティクルを使用して、手順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によるものですこちらをご覧ください


バツ1|バツ0N01バツ1|バツ0Nバツ01

それは正しい、私はタイプミスを修正した
クリスハウグ

パスを再サンプリングする必要はありませんか?他の文献から、パスをサンプリングする必要はありません。各タイムステップで粒子をサンプリングするだけです。パスをリサンプリングする理由があるかどうか疑問に思っていました
-tintinthong
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.