0

存在三个基本的 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库来解决这些问题?

4

1 回答 1

4

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

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

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

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

于 2018-04-18T08:57:39.570 回答