นั่นคือความหนาแน่นของการเปลี่ยนสถานะ ( ) ซึ่งเป็นส่วนหนึ่งของแบบจำลองของคุณและเป็นที่รู้จักกันดี คุณจำเป็นต้องสุ่มตัวอย่างจากมันในอัลกอริทึมพื้นฐาน แต่การประมาณนั้นเป็นไปได้ คือการกระจายข้อเสนอในกรณีนี้ มันถูกใช้เพราะการกระจายโดยทั่วไปจะไม่เวิ้งว้างxtp(xt|xt−1) p(xt|x0:t−1,y1:t)
ใช่นั่นคือความหนาแน่นของการสังเกตซึ่งเป็นส่วนหนึ่งของแบบจำลองด้วยเช่นกัน ใช่นั่นคือความหมายของการทำให้เป็นมาตรฐาน tilde ใช้เพื่อบ่งบอกถึงบางอย่างเช่น "preliminary":คือก่อนที่จะทำการสุ่มใหม่และคือก่อนที่จะทำการปรับสภาพใหม่ ฉันเดาว่าจะทำแบบนี้เพื่อให้สัญกรณ์ตรงกับความแตกต่างระหว่างอัลกอริทึมที่ไม่มีขั้นตอนการสุ่มใหม่ (เช่นเป็นค่าประมาณสุดท้ายเสมอ)x~xw~wx
เป้าหมายสุดท้ายของตัวกรอง bootstrap คือการประเมินลำดับของการแจกแจงแบบมีเงื่อนไข (สถานะที่ไม่สามารถสังเกตได้ที่ให้การสังเกตทั้งหมดจนถึง )p(xt|y1:t)tt
พิจารณารูปแบบที่เรียบง่าย:
Xt=Xt−1+ηt,ηt∼N(0,1)
X0∼N(0,1)
Yt=Xt+εt,εt∼N(0,1)
นี่คือการเดินแบบสุ่มที่สังเกตด้วยเสียง (คุณสังเกตแค่ไม่ใช่ ) คุณสามารถคำนวณอย่างแน่นอนด้วยตัวกรอง Kalman แต่เราจะใช้ตัวกรอง bootstrap ตามคำขอของคุณ เราสามารถปรับปรุงรูปแบบในแง่ของการกระจายการเปลี่ยนสถานะการกระจายสถานะเริ่มต้นและการกระจายการสังเกต (ตามลำดับ) ซึ่งมีประโยชน์มากกว่าสำหรับตัวกรองอนุภาค:YXp(Xt|Y1,...,Yt)
Xt|Xt−1∼N(Xt−1,1)
X0∼N(0,1)
Yt|Xt∼N(Xt,1)
การใช้อัลกอริทึม:
การเริ่มต้น. เราสร้างอนุภาค (อิสระ) ตาม(0,1)NX(i)0∼N(0,1)
เราจำลองแต่ละอนุภาคไปข้างหน้าอย่างอิสระโดยสร้างสำหรับแต่ละNX(i)1|X(i)0∼N(X(i)0,1)N
จากนั้นเราคำนวณความน่าจะเป็นโดยที่คือ ความหนาแน่นปกติพร้อมค่าเฉลี่ยและความแปรปรวน (ความหนาแน่นของการสังเกตของเรา) เราต้องการให้น้ำหนักมากขึ้นกับอนุภาคซึ่งมีแนวโน้มที่จะสร้างการสังเกตที่เราบันทึกไว้ เราทำให้น้ำหนักเหล่านี้เป็นปกติเพื่อให้รวมเป็น 1w~(i)t=ϕ(yt;x(i)t,1)ϕ(x;μ,σ2)μσ2yt
เรา resample อนุภาคตามน้ำหนักเหล่านี้w_tโปรดทราบว่าอนุภาคเป็นเส้นทางแบบเต็มของ (นั่นคือไม่เพียงแค่ส่งตัวอย่างจุดสุดท้ายซ้ำอีกครั้งนั่นคือสิ่งทั้งหมดซึ่งพวกเขาแสดงว่าเป็น )wtxx(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 และฮันเซนให้ดูที่นี่