Це щільність переходу стану ( ), яка є частиною вашої моделі і тому відома. Вам потрібно пробити вибірку з нього в базовому алгоритмі, але можливі наближення. - розподіл пропозицій у цьому випадку. Він використовується тому, що розподіл як правило, не простежується. p ( x t | x t - 1 ) p ( x t | x 0 : t - 1 , y 1 : t )хтр ( хт| хt - 1) р ( хт| х0 : t - 1, у1 : т)
Так, це щільність спостереження, яка також є частиною моделі, і тому відома. Так, саме це означає нормалізацію. Тільда використовуються для позначення що - щось на зразок «попередньої»: є до того передіскретізаціей, і є перед тим перенормировки. Я б припустив, що це робиться таким чином, щоб позначення співпадали між варіантами алгоритму, які не мають кроку перекомпонування (тобто завжди є остаточною оцінкою). x ˜ w wxх~хш~шх
Кінцева мета фільтра завантаження - оцінити послідовність умовних розподілів (стан, який не спостерігається при , з урахуванням усіх спостережень до ).t tр ( хт| у1 : т)тт
Розглянемо просту модель:
Хт= Xt - 1+ ηт,ηт∼ N( 0 , 1 )
Х0∼ N( 0 , 1 )
Yт= Xт+ εт,εт∼ N( 0 , 1 )
Це випадкова хода, що спостерігається із шумом (ви спостерігаєте лише , а не ). Ви можете обчислити саме за допомогою фільтра Kalman, але ми використаємо фільтр завантаження на ваш запит. Ми можемо відновити модель з точки зору розподілу стану переходу, початкового розподілу стану та розподілу спостережень (у такому порядку), що є більш корисним для фільтра частинок:YХр ( Xт| Y1, . . . , Yт)
Хт| Хt - 1∼ N( Xt - 1, 1 )
Х0∼ N( 0 , 1 )
Yт| Хт∼ N( Xт, 1 )
Застосування алгоритму:
Ініціалізація. Ми генеруємо частинок (незалежно) відповідно до .NХ( i )0∼ N( 0 , 1 )
Ми моделюємо кожну частинку вперед незалежно, генеруючи , для кожного .Х( i )1| Х( i )0∼ N( X( i )0, 1 )N
Потім ми обчислюємо ймовірність , де - нормальна щільність із середнім та дисперсією (наша щільність спостереження). Ми хочемо надати більше ваги частинкам, які швидше за все виробляють спостереження яке ми записали. Ми нормалізуємо ці ваги, щоб вони дорівнювали 1.ш~( i )т= ϕ ( ут; х( i )т, 1 )ϕ ( x ; μ , σ2)мкσ2ут
Ми перепробовуємо частинки відповідно до цих ваг . Зауважте, що частинка - це повний шлях (тобто не перепробовуйте останню точку, це все, що вони позначають як ).штхх( i )0 : т
Поверніться до кроку 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)
Отриманий графік:
Корисний підручник - підручник Дусета та Йохансена, дивіться тут .