1

我正在做一个需要使用隐藏马尔可夫模型的项目。我下载了 Kevin Murphy 的工具箱。我有一些关于使用的问题。在工具箱网页中,他说 dhmm_em 和 dhmm_logprob 的第一个输入是符号序列数据。在他们的示例中,他们将行向量作为数据。因此,当我将符号序列作为行向量给出时,我得到了错误;

??? Error using ==> assert at 9
assertion violated:

Error in ==> fwdback at 105
assert(approxeq(sum(alpha(:,t)),1))

Error in ==> dhmm_logprob at 17
  [alpha, beta, gamma, ll] = fwdback(prior,
  transmat, obslik, 'fwd_only', 1);

Error in ==> mainCourseProject at 110
            loglik(train_act) =
            dhmm_logprob(orderedSymbols,
            hmm{train_act}.prior,
            hmm{train_act}.trans,
            hmm{act}.emiss);

但是,在给出此错误之前,代码适用于某些符号向量。当我将数据作为列向量提供时,函数工作正常,没有错误。那么我到底为什么会收到这个错误呢?

你可能会说我不应该给出单个向量,而是向量集,我还尝试将我的特征向量收集在一个结构中并给出行向量,但是没有任何改变,我仍然得到断言错误。

顺便说一句,我的符号序列没有任何零,我所做的一切几乎与他们在示例中显示的一样,所以如果有人能帮助我,我将不胜感激。

4

2 回答 2

2

我不确定,但从上面显示的函数调用堆栈来看,最后一行不应该hmm{train_act}.emisshmm{act}.emiss. 换句话说,当您计算序列的对数概率时,您应该传递属于同一 HMM 模型的分量(转换矩阵、发射矩阵和先验概率)。

顺便说一句,代码中的 ASSERT 是一个健全性检查,概率向量的总和应为1. 通常,当使用非常小的值(对数概率)时,数值稳定性问题可能会蔓延……您可以编辑 APPROXEQ 函数以稍微放宽比较,给它更大的误差范围

于 2012-06-12T16:24:27.200 回答
1

此错误消息及其引用的代码是人类可读的。断言是程序员设置的保护,以确保满足某些条件。在这种情况下,条件是什么? approxeq(sum(alpha(:,t)),1) 我敢说 approxeq 希望值大致相等,所以这归结为:sum(alpha(:,t)) ~= 1

在对代码一无所知的情况下,我也猜测这些指的是概率。节点边的概率之和必须为 1。希望这能让您走上一条高效的调试之路。如果您无法弄清楚产生这种情况的输入有什么问题,请开始深入研究代码,看看这个 alpha 向量来自哪里,以及它是如何导致无效的。

于 2012-06-12T15:17:34.377 回答