kevin murphy hmm matlab toolbox assertionerror

时间:2012-06-12 12:13:41

标签: matlab hidden-markov-models

我正在开发一个需要使用隐藏马尔可夫模型的项目。我下载了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);

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

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

顺便说一下,我的符号序列没有任何零,我所做的一切几乎和他们在例子中所示的相同,所以如果有人能帮助我,我会很高兴。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

在不了解代码的情况下,我也猜测这些是指概率。节点边缘的概率必须总和为1。希望这能让您了解一条富有成效的调试路径。如果你无法弄清楚产生这种情况的输入有什么问题,可以开始涉及代码,看看这个alpha矢量来自哪里,以及它最终如何无效。