이것이 모델의 일부이므로 알려진 상태의 전이 밀도 ( )입니다. 기본 알고리즘으로 샘플링해야하지만 근사값이 가능합니다. 은 제안서 배포입니다. 분포 는 일반적으로 다루기 어렵 기 때문에 사용됩니다.xtp(xt|xt−1) p(xt|x0:t−1,y1:t)
그렇습니다. 관측 밀도는 모델의 일부이기도하므로 알려진 밀도입니다. 예, 이것이 정규화의 의미입니다. 물결표는 "예비"와 같은 것을 나타내는 데 사용됩니다. 는 리샘플링하기 전에 이고, 는 다시 정규화하기 전에 입니다. 나는 리샘플링 단계가없는 알고리즘의 변형들 사이에서 표기법이 일치하도록이 방법으로 수행 될 것이라고 추측합니다 (즉, 는 항상 최종 추정치입니다).x~xw~wx
부트 스트랩 필터의 최종 목표는 조건부 분포들 시퀀스 추정하는 것이다 (관측 상태에서 까지 모든 관찰 주어 ).p(xt|y1:t)tt
간단한 모델을 고려하십시오.
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)
알고리즘 적용 :
초기화. 에 따라 입자를 (독립적으로) 생성 합니다.NX(i)0∼N(0,1)
우리는각 에 대해 .NX(i)1|X(i)0∼N(X(i)0,1)N
그런 다음 가능성 . 여기서 는 평균 및 분산 (관측 밀도)를 갖는 정규 밀도 . 우리는 우리 가 기록한 관측 값 를 생성 할 가능성이 높은 입자에 더 많은 가중치를 부여하려고합니다 . 이 가중치를 정규화하여 합계는 1이됩니다.φ(X,μ,σ2)μσ2Ytw~(i)t=ϕ(yt;x(i)t,1)ϕ(x;μ,σ2)μσ2yt
이 가중치 에 따라 입자를 다시 샘플링합니다 . 참고 • 그래도 입자 의 전체 경로입니다 (즉, 단지 그들이으로 나타내는 모든 일,의, 마지막 점을 재 샘플링하지 않습니다 ). x x ( i ) 0 : twtxx(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의 튜토리얼입니다 ( 여기 참조) .