Contenu connexe
Similaire à お前の逐モン、GETだぜ!
Similaire à お前の逐モン、GETだぜ! (8)
お前の逐モン、GETだぜ!
- 30. そんなSMC, 書いてみた
30
particle.filter <- function(x0, size.particle, size.dim, size.data, system.equation, likelihood, lag=0)
{
total.loglikelihood <- 0
#dimension index : paricle * dimension * lag
dims <- c(size.particle, size.dim, lag+1)
x0 <- array(c(rep(x0, each=size.particle),rep(NA, size.dim*size.particle*lag)), dims)
x <- array(rep(NA, size.particle*size.dim*(lag+1)), dims)
dimnames(x0) <- make.name(size.particle, size.dim, lag)
dimnames(x) <- make.name(size.particle, size.dim, lag)
states <- vector("list", size.data)
for( t in 1:size.data)
{
#Prediction : p(x_{t}|x_{t-1})
for(index.particle in 1:size.particle)
{
x[index.particle,, 1] <- system.equation(x0[index.particle,,1])
x[index.particle,,-1] <- x0[index.particle,,-(lag+1)]
}
#Likelihood : p(y_{t}|y_{1:t})
w <- apply(x, 1, function(z){likelihood(t, z[,1])})
total.loglikelihood <- total.loglikelihood + log(sum(w)/size.particle)
#Weight ' resampling
index <- resampling(w/sum(w))
#Filtering : p(x_{t}|y_{t})
x0 <- x[index,,,drop=FALSE]
states[[t]] <- make.state(t, w, x, x0)
}
list(loglikelihood=total.loglikelihood, size=c(particle=size.particle, data=size.data, dim=size.dim,lag=lag), states=states)
}