如何使用 hmmlearn 解决基本的 HMM 问题

How to solve basic HMM problems with hmmlearn

存在三个基本的 HMM 问题:

Problem 1 (Likelihood): Given an HMM λ = (A,B) and an observation sequence O, determine the likelihood P(O|λ).

Problem 2 (Decoding): Given an observation sequence O and an HMM λ = (A,B), discover the best hidden state sequence Q.

Problem 3 (Learning): Given an observation sequence O and the set of states in the HMM, learn the HMM parameters A and B.

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

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

我最初的任务如下:我有 100 万个大小相同的短句(10 个单词)。我想用该数据训练 HMM 模型,并为测试数据(又是 10 个单词的句子)预测模型中每个句子的概率。并且根据这个概率我会决定是通常还是不寻常的短语。

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

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

分数方法计算数值稳定性的对数概率。将大量数字相乘可能会导致数字溢出或下溢 - 即数字可能太大而无法存储在内存中或太小而无法与零区分开来。解决方案是改为添加它们的对数。

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

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