实现L-BFGS算法的隐形马尔可夫模型的代码如下:
library(lbfgs) library(HMM)
定义隐形马尔可夫模型
N <- 4 M <- 3 A <- matrix(c(0.6,0.2,0.1,0.1,0.3,0.5,0.1,0.1,0.2,0.1,0.4,0.3,0.1,0.1,0.4,0.4),nrow=N,ncol=N,byrow=TRUE) B <- matrix(c(0.1,0.3,0.6,0.5,0.4,0.1,0.4,0.2,0.3,0.5,0.3,0.2),nrow=M,ncol=N,byrow=TRUE) pi <- c(0.25,0.25,0.25,0.25) train.obs <- sample(1:M,15,replace=T)
定义似然函数
loglikfn <- function(pars) { pi <- pars[1:N] A <- matrix(pars[(N+1):(N+N*N)],N,N) B <- matrix(pars[(N+N*N+1):length(pars)],M,N) hmm <- initHMM(pi, A, B) loglik <- forwardbackward(train.obs, hmm)$loglik -loglik }
定义L-BFGS算法的初始参数值
start_pars <- c(pi, A, B) optim_pars <- lbfgs(start_pars, loglikfn, lower=-10, upper=10)$par
打印出最优参数
pi <- optim_pars[1:N] A <- matrix(optim_pars[(N+1):(N+N*N)],N,N) B <- matrix(optim_pars[(N+N*N+1):length(optim_pars)],M,N) hmm <- initHMM(pi, A, B) hmm