Bootstrap filter / อัลกอริทึมตัวกรองอนุภาค (ทำความเข้าใจ)


12

ฉันขาดความเข้าใจอย่างแท้จริงว่าตัวกรอง bootstrap ทำงานอย่างไร ฉันรู้แนวคิดคร่าวๆ แต่ไม่เข้าใจรายละเอียดบางอย่าง คำถามนี้สำหรับฉันที่จะล้างความยุ่งเหยิง ที่นี่ฉันจะใช้อัลกอริทึมตัวกรองยอดนิยมนี้จากการอ้างอิงโดย doucet (จนถึงตอนนี้ฉันคิดว่านี่เป็นการอ้างอิงที่ง่ายที่สุด) ก่อนอื่นให้ฉันบอกคุณว่าปัญหาของฉันคือการทำความเข้าใจว่าการแจกแจงนั้นรู้จักกันที่ไหนและไม่รู้อะไร

ตัวกรอง bootstrap

นี่คือคำถามของฉัน:

  1. ใน 2) การกระจายคืออะไร การกระจายนี้เป็นที่รู้จักกัน ? เราจะรู้กระจายนี้สำหรับทุก ? ถ้าใช่ แต่ถ้าเราไม่สามารถลองได้ เป็นเรื่องตลกที่พวกเขาเรียกขั้นตอนการสุ่มตัวอย่างที่สำคัญนี้ แต่ฉันไม่เห็นการกระจายข้อเสนอp(xt|xt1(i))t
  2. นอกจากนี้ใน 2)การกระจายที่รู้จักหรือไม่ "น้ำหนักความสำคัญของการทำให้เป็นมาตรฐานหมายถึง ? tilde บนและหมายถึงอะไรมันหมายถึงบางสิ่งบางอย่างที่ไม่ถูกสุ่มหรือไม่ได้มาตรฐานตามลำดับ?p(yt|x~t(i))wt(i)=w~t(i)i=1Nw~t(i)xw
  3. ฉันจะขอบคุณถ้าใครสามารถยกตัวอย่างของเล่นง่ายๆโดยใช้ดิสทริบิวชันที่มีชื่อเสียงเพื่อใช้ฟิลเตอร์ bootstrap นี้ เป้าหมายสุดท้ายของตัวกรอง bootstrap นั้นไม่ชัดเจนสำหรับฉัน

คำตอบ:


10
  1. นั่นคือความหนาแน่นของการเปลี่ยนสถานะ ( ) ซึ่งเป็นส่วนหนึ่งของแบบจำลองของคุณและเป็นที่รู้จักกันดี คุณจำเป็นต้องสุ่มตัวอย่างจากมันในอัลกอริทึมพื้นฐาน แต่การประมาณนั้นเป็นไปได้ คือการกระจายข้อเสนอในกรณีนี้ มันถูกใช้เพราะการกระจายโดยทั่วไปจะไม่เวิ้งว้างxtp(xt|xt1) p(xt|x0:t1,y1:t)

  2. ใช่นั่นคือความหนาแน่นของการสังเกตซึ่งเป็นส่วนหนึ่งของแบบจำลองด้วยเช่นกัน ใช่นั่นคือความหมายของการทำให้เป็นมาตรฐาน tilde ใช้เพื่อบ่งบอกถึงบางอย่างเช่น "preliminary":คือก่อนที่จะทำการสุ่มใหม่และคือก่อนที่จะทำการปรับสภาพใหม่ ฉันเดาว่าจะทำแบบนี้เพื่อให้สัญกรณ์ตรงกับความแตกต่างระหว่างอัลกอริทึมที่ไม่มีขั้นตอนการสุ่มใหม่ (เช่นเป็นค่าประมาณสุดท้ายเสมอ)x~xw~wx

  3. เป้าหมายสุดท้ายของตัวกรอง bootstrap คือการประเมินลำดับของการแจกแจงแบบมีเงื่อนไข (สถานะที่ไม่สามารถสังเกตได้ที่ให้การสังเกตทั้งหมดจนถึง )p(xt|y1:t)tt

พิจารณารูปแบบที่เรียบง่าย:

Xt=Xt1+ηt,ηtN(0,1)
X0N(0,1)
Yt=Xt+εt,εtN(0,1)

นี่คือการเดินแบบสุ่มที่สังเกตด้วยเสียง (คุณสังเกตแค่ไม่ใช่ ) คุณสามารถคำนวณอย่างแน่นอนด้วยตัวกรอง Kalman แต่เราจะใช้ตัวกรอง bootstrap ตามคำขอของคุณ เราสามารถปรับปรุงรูปแบบในแง่ของการกระจายการเปลี่ยนสถานะการกระจายสถานะเริ่มต้นและการกระจายการสังเกต (ตามลำดับ) ซึ่งมีประโยชน์มากกว่าสำหรับตัวกรองอนุภาค:YXp(Xt|Y1,...,Yt)

Xt|Xt1N(Xt1,1)
X0N(0,1)
Yt|XtN(Xt,1)

การใช้อัลกอริทึม:

  1. การเริ่มต้น. เราสร้างอนุภาค (อิสระ) ตาม(0,1)NX0(i)N(0,1)

  2. เราจำลองแต่ละอนุภาคไปข้างหน้าอย่างอิสระโดยสร้างสำหรับแต่ละNX1(i)|X0(i)N(X0(i),1)N

    จากนั้นเราคำนวณความน่าจะเป็นโดยที่คือ ความหนาแน่นปกติพร้อมค่าเฉลี่ยและความแปรปรวน (ความหนาแน่นของการสังเกตของเรา) เราต้องการให้น้ำหนักมากขึ้นกับอนุภาคซึ่งมีแนวโน้มที่จะสร้างการสังเกตที่เราบันทึกไว้ เราทำให้น้ำหนักเหล่านี้เป็นปกติเพื่อให้รวมเป็น 1w~t(i)=ϕ(yt;xt(i),1)ϕ(x;μ,σ2)μσ2yt

  3. เรา resample อนุภาคตามน้ำหนักเหล่านี้w_tโปรดทราบว่าอนุภาคเป็นเส้นทางแบบเต็มของ (นั่นคือไม่เพียงแค่ส่งตัวอย่างจุดสุดท้ายซ้ำอีกครั้งนั่นคือสิ่งทั้งหมดซึ่งพวกเขาแสดงว่าเป็น )wtxx0:t(i)

กลับไปที่ขั้นตอนที่ 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 และฮันเซนให้ดูที่นี่


สำหรับสัญลักษณ์แสดงหัวข้อย่อยของคุณ 2) ในการใช้อัลกอริทึม -> ?? ขอบคุณมาก. ฉันมีตัวกรอง bootstrap ที่ใช้งานได้ในรุ่นนี้ ขอขอบคุณที่ให้ความสำคัญกับการปรับเส้นทางใหม่และไม่ใช่แค่อนุภาค t-th X1(i)|X0(i)N(0,1)X1(i)|X0(i)N(X0(i),1)
tintinthong

ถูกต้องฉันแก้ไขข้อผิดพลาด
Chris Haug

เส้นทางไม่จำเป็นต้องถูกสุ่มตัวอย่างอีกครั้งหรือไม่? จากวรรณกรรมอื่น ๆ ไม่จำเป็นต้องมีตัวอย่างเส้นทาง ฉันต้องการตัวอย่างอนุภาคในแต่ละขั้นตอน ฉันสงสัยว่ามีเหตุผลที่จะเปลี่ยนเส้นทางใหม่หรือไม่
tintinthong
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.