版本1)
好。因此,我定义了少数状态并定义了统一的过渡和发射概率:
NUM.STATES = 6
states <- c() # we will create k dummy states
for (i in 1:NUM.STATES) {
states <- c(states, paste0("State_", i))
}
start.probs <- rep(1.0 / NUM.STATES, NUM.STATES) # we assume equal probability for all states
trans.probs <- matrix(rep(start.probs, NUM.STATES), ncol=NUM.STATES, nrow=NUM.STATES)
rownames(trans.probs) <- colnames(trans.probs) <- states
symbols <- observations.alphabet
num.symbols <- length(symbols)
tmp.probs <- rep(1.0 / num.symbols, num.symbols)
emit.probs <- matrix(rep(tmp.probs, NUM.STATES), ncol=num.symbols, nrow=NUM.STATES)
rownames(emit.probs) <- states
colnames(emit.probs) <- symbols
emit.probs <- t(emit.probs)
初始概率通常如下:
> trans.probs
State_1 State_2 State_3 State_4 State_5 State_6
State_1 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
State_2 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
State_3 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
State_4 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
State_5 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
State_6 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
> head(emit.probs)
State_1 State_2 State_3 State_4 State_5 State_6
A 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158
B 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158
C 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158
D 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158
E 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158
F 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158 0.05263158
当我将具有这些初始参数的HMM拟合到一系列观察时,转换矩阵根本不会改变。
require(hmm.discnp)
tmp.hmm <- hmm(y=observation, yval=observations.alphabet,
+ par0=par0, verbose=T)
Initial set-up completed ...
Repeating ...
EM step 1:
Log-likelihood: -648.1533
Percent decrease in log-likelihood: 20.53143
Root-SS of change in coef.: 0.630401
Max. abs. change in coef.: 0.127874
EM step 2:
Log-likelihood: -648.1533
Percent decrease in log-likelihood: 0
Root-SS of change in coef.: 0
Max. abs. change in coef.: 0
> tmp.hmm$tpm
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
[2,] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
[3,] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
[4,] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
[5,] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
[6,] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
可以看出,只有两次迭代后学习才会停止!我认为这证明了观察到的序列中没有真实的信息。
版本2)
但是,如果我使用trans.probs和emit.probs的随机初始化,它似乎会给出更合理的结果。
tmp.hmm <- hmm(y=observation, yval=observations.alphabet,
K=NUM.STATES, verbose=T, rand.start=list(tpm=T,Rho=T))
Initial set-up completed ...
重复......
EM step 1:
Log-likelihood: -645.833
Percent decrease in log-likelihood: 23.1746
Root-SS of change in coef.: 0.761316
Max. abs. change in coef.: 0.306738
EM step 2:
Log-likelihood: -643.9232
Percent decrease in log-likelihood: 0.295714
Root-SS of change in coef.: 0.075387
Max. abs. change in coef.: 0.032037
(...)
EM step 63:
Log-likelihood: -520.5877
Percent decrease in log-likelihood: 9.8e-05
Root-SS of change in coef.: 0.000836
Max. abs. change in coef.: 0.000365
显然,现在的学习似乎有效。结果转换矩阵看起来也更有趣:
> tmp.hmm$tpm
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3.821969e-35 6.218981e-72 9.804360e-01 1.956405e-02 9.371930e-79 3.591732e-38
[2,] 3.167994e-01 6.832006e-01 1.395910e-41 5.558022e-63 3.729498e-17 1.879235e-08
[3,] 2.922663e-01 5.705791e-02 1.918361e-01 2.948879e-02 2.427380e-10 4.293510e-01
[4,] 2.872490e-12 2.558908e-151 1.000000e+00 0.000000e+00 1.532313e-75 7.253783e-75
[5,] 1.866111e-32 4.066253e-01 2.264881e-51 3.583309e-101 5.930935e-01 2.811617e-04
[6,] 3.272425e-31 5.905480e-01 8.061218e-43 6.947626e-02 3.399757e-01 1.029613e-17
所以,问题是,两个设置之间有什么区别,哪个设置可以信任!?在版本1中我的缺陷在哪里,使用统一(&#34;无信息&#34;)先验概率!?