Filter bootstrap / Algoritma filter partikel (Memahami)

12

Saya benar-benar kurang memahami cara kerja filter bootstrap. Saya kira-kira tahu konsepnya tetapi saya gagal memahami detail tertentu. Pertanyaan ini bagi saya untuk membersihkan kekacauan. Di sini saya akan menggunakan algoritma filter populer ini dari referensi oleh doucet (sejauh ini saya pikir ini adalah referensi termudah). Pertama-tama saya beri tahu Anda bahwa masalah saya adalah memahami distribusi mana yang diketahui dan mana yang tidak diketahui.

filter bootstrap

Ini adalah pertanyaan saya:

  1. Dalam 2), apa distribusi ? Apakah distribusi ini diketahui ? Apakah kita tahu distribusi ini untuk semua ? Jika demikian, tetapi bagaimana jika kita tidak dapat mengambil sampel darinya? Sangat lucu mereka menyebut ini sebagai langkah pengambilan sampel penting tetapi saya tidak melihat distribusi proposal.p(xt|xt1(i))t
  2. Juga di 2) adalah sebuah diketahui distribusi? "Normalisasi Bobot Penting artinya ? Apa arti dari tilde pada dan ? Apakah ini berarti masing-masing seperti un-resampled atau un-normalized?p(yt|x~t(i))wt(i)=w~t(i)i=1Nw~t(i)xw
  3. Saya akan sangat menghargai jika ada yang bisa memberikan contoh mainan sederhana menggunakan distribusi terkenal untuk menggunakan filter bootstrap ini. Tujuan akhir dari filter bootstrap tidak jelas bagi saya.
tintinthong
sumber

Jawaban:

10
  1. Itu adalah kepadatan transisi keadaan ( ), yang merupakan bagian dari model Anda dan karenanya dikenal. Anda perlu mengambil sampel dari itu dalam algoritma dasar, tetapi perkiraan mungkin. adalah distribusi proposal dalam kasus ini. Ini digunakan karena distribusi umumnya tidak dapat ditelusuri.xtp(xt|xt1) p(xt|x0:t1,y1:t)

  2. Ya, itulah densitas pengamatan, yang juga merupakan bagian dari model, dan karenanya diketahui. Ya, itulah arti normalisasi. Tilde digunakan untuk menandakan sesuatu seperti "pendahuluan": adalah sebelum resampling, dan adalah sebelum renormalisasi. Saya akan menebak bahwa itu dilakukan dengan cara ini sehingga notasi cocok antara varian dari algoritma yang tidak memiliki langkah resampling (yaitu selalu merupakan estimasi akhir). x ˜ w wxx~xw~wx

  3. Tujuan akhir dari filter bootstrap adalah untuk memperkirakan urutan distribusi kondisional (keadaan tidak dapat diobservasi pada , memberikan semua pengamatan sampai ).t tp(xt|y1:t)tt

Pertimbangkan model sederhana:

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

Ini adalah jalan acak yang diamati dengan kebisingan (Anda hanya mengamati , bukan ). Anda dapat menghitung persis dengan filter Kalman, tetapi kami akan menggunakan filter bootstrap atas permintaan Anda. Kita dapat menyatakan kembali model dalam hal distribusi transisi keadaan, distribusi keadaan awal, dan distribusi pengamatan (dalam urutan itu), yang lebih berguna untuk filter partikel:YXp(Xt|Y1,...,Yt)

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

Menerapkan algoritma:

  1. Inisialisasi. Kami menghasilkan partikel (independen) sesuai dengan .NX0(i)N(0,1)

  2. Kami mensimulasikan setiap partikel maju secara mandiri dengan menghasilkan , untuk setiap .X1(i)|X0(i)N(X0(i),1)N

    Kami kemudian menghitung kemungkinan , di mana adalah kepadatan normal dengan mean dan varians (kepadatan pengamatan kami). Kami ingin memberi bobot lebih pada partikel yang lebih mungkin menghasilkan pengamatan yang kami rekam. Kami menormalkan bobot ini sehingga jumlahnya 1.w~t(i)=ϕ(yt;xt(i),1)ϕ(x;μ,σ2)μσ2yt

  3. Kami menguji ulang partikel sesuai dengan bobot ini . Perhatikan bahwa suatu partikel adalah lintasan penuh (yaitu jangan hanya mengulangi titik terakhir, itu keseluruhannya, yang mereka nyatakan sebagai ).wtxx0:t(i)

Kembali ke langkah 2, bergerak maju dengan versi partikel yang di-resampled, sampai kami telah memproses keseluruhan seri.

Implementasi dalam R berikut:

# 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)

Grafik yang dihasilkan:masukkan deskripsi gambar di sini

Tutorial yang bermanfaat adalah yang ditulis oleh Doucet dan Johansen, lihat di sini .

Chris Haug
sumber
Untuk poin Anda 2) dalam menerapkan algoritma -> ?? Terima kasih banyak. Saya memiliki filter bootstrap yang berfungsi di bawah model ini. Terima kasih untuk penekanan pada resampling jalan dan bukan hanya partikel t-th. X ( i ) 1 | X ( i ) 0N ( X ( i ) 0 , 1 )X1(i)|X0(i)N(0,1)X1(i)|X0(i)N(X0(i),1)
tintinthong
Itu benar, saya memperbaiki kesalahan ketik
Chris Haug
Jalan tidak harus sampel ulang kan ?? Dari literatur lain, tidak perlu sampel jalan. Saya hanya perlu sampel partikel pada setiap langkah waktu. Saya bertanya-tanya apakah ada alasan untuk resampling jalan
tintinthong