如何使用 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,我的程序开始运行良好,所以我推荐它。
存在三个基本的 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,我的程序开始运行良好,所以我推荐它。