我正在开发一个需要使用隐藏马尔可夫模型的项目。我下载了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);
但是,在给出此错误之前,代码适用于某些符号向量。当我将数据作为列向量时,函数工作正常,没有错误。那么为什么我得到这个错误呢?
你可能会说我应该给的不是单个向量,而是向量集,我也尝试在结构中收集我的特征向量并给出行向量,但没有改变,我仍然得到断言错误。
顺便说一下,我的符号序列没有任何零,我所做的一切几乎和他们在例子中所示的相同,所以如果有人能帮助我,我会很高兴。
答案 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矢量来自哪里,以及它最终如何无效。