rm(list=ls(all=TRUE)) cat("\014") ######################### EMHMMExp<-function(data, k) { T=length(data) stat=matrix(rep(data,k),nrow=k,byrow=TRUE) #k*T #hidden state a=matrix(rexp(T*k,1),nrow=k) #k*T a=a/matrix(rep(colSums(a),k),nrow=k,byrow=TRUE) #Parameters c=rowMeans(a) #k*1 nu=rowSums(a*stat)/rowSums(a) #k*1 P=matrix(rexp(k*k,1),nrow=k) #k*k, transition matrix, P=P/matrix(rep(rowSums(P),k),nrow=k) ##Pij=Prob(q_{t+1}=j|q_t=i) #Set up threshold=10^(-5) continue=TRUE while(continue){ density=exp(-(1/nu)%*%t(data))/matrix(rep(nu,T),nrow=k) #k*T #E step alpha-beta algorithm scaledAlpha=as.matrix(1/k*density[,1]) #alpha(q0) k*1 scale=sum(scaledAlpha) scaledAlpha=scaledAlpha/scale for (t in 2:T) { scaledAlpha=cbind(scaledAlpha,t(density[,t]*(t(scaledAlpha[,t-1])%*%P))) scale=c(scale,sum(scaledAlpha[,t])) scaledAlpha[,t]=scaledAlpha[,t]/scale[t] } #scaledAlpha[,t]=1/scale[t]*alpha[,t] scaledBeta=cbind(P%*%density[,T-1]/scale[T-1],density[,T]/scale[T]) #scaledBeta[,t]=1/scale[t]beta[,t] for (t in (T-2):1) { scaledBeta=cbind(P%*%(density[,t+1]*scaledBeta[,1])/scale[t], scaledBeta) } aNew=scaledAlpha*scaledBeta aNew=aNew/matrix(rep(colSums(aNew),k),nrow=k,byrow=TRUE) #M step cNew=rowMeans(aNew) nuNew=rowSums(aNew*stat)/rowSums(aNew) PNew=mapply(function(x) rowSums(matrix(rep(aNew[x,1:(T-1)],k),nrow=k,byrow=TRUE)*aNew[,2:T]), 1:k) PNew=t(PNew) PNew=PNew/matrix(rep(rowSums(PNew),k),nrow=k) #Stop criterion if(max(c(abs(cNew-c),abs(nuNew-nu),abs(c(P-PNew))))