如何解决hmmlearn的基本HMM问题

时间:2018-04-17 14:05:11

标签: machine-learning hidden-markov-models anomaly-detection

有三个基本的HMM问题:

  

问题1(可能性):给定HMMλ=(A,B)和观察   序列O,确定似然P(O |λ)。

     

问题2(解码):给定观察序列O和HMMλ=   (A,B),发现最好的隐藏状态序列Q.

     

问题3(学习):给定观察序列O和集合   HMM中的状态,学习HMM参数A和B.

我对问题## 1和3感兴趣。一般来说,第一个问题可以用前向算法解决,第三个问题可以用Baum-Welch算法解决。我是否应该使用hmmlearn的fit(X, lengths)score(X, lengths)方法分别解决第一和第三个问题? (文档没有说score使用转发算法。)

我还有一些关于score方法的问题。为什么score计算日志概率?为什么如果我将几个序列传递给score,它会返回每个序列的对数概率而不是概率的总和?

我的原始任务如下:我有100万个相同大小的短句(10个单词)。我想用该数据训练HMM模型,并且测试数据(再次10个单词的句子)预测模型中每个句子的概率。基于这种可能性,我将决定通常或不寻常的短语。

也许有更好的python库来解决这些问题?

1 个答案:

答案 0 :(得分:3)

如果您将模型拟合到单个序列上,则应分别使用score(X)fit(X)来解决第一个和第三个问题(因为长度=无是默认值,您不需要需要明确传递它。处理多个序列时,您应该将它们的长度列表作为length参数传递,请参阅documentation

得分方法计算数值稳定性的对数概率。乘以大量数字可能导致数值上溢或下溢 - 即数字可能太大而无法存储在内存中或太小而无法与零区分。解决方案是添加对数。

得分方法返回所有序列的对数概率之和,因为这是它的实现方式。您想要的功能的功能请求已在一个月前提交,因此可能很快就会出现。 https://github.com/hmmlearn/hmmlearn/issues/272或者您可以分别对每个序列进行评分。

hmmlearn库是一个很好的python库,可用于隐藏的马尔可夫模型。我尝试过使用不同的库,ghmm,我得到了奇怪的数值下溢。事实证明,他们对高斯HMM的Baum-Welch算法的实现在数值上是不稳定的。他们使用LU分解而不是Cholesky分解来计算协方差矩阵的逆,这有时会导致协方差矩阵不再是正半定。 hmmlearn库使用Cholesky分解。我切换到hmmlearn,我的程序开始正常工作,所以我推荐它。