求教HMM初始化(扩展编程)
小弟初做HMM,利用《matlab扩展编程》上的例程来跑。但是一直出现总和输出概率为NaN的问题。
我在网上已经查了很久出错原因,大家给出的说法也是各种各样,还是来这里求个终解。
我自己用debug一步一步试过,在inithmm中发现了自己不明白的地方。
原程如下:
function mix = getmix(vector, M)
= KMEANS(vector,M);
%
for j = 1:M
ind = find(j==nn);
tmp = vector(ind,:);
var(j,:) = std(tmp);
% m(j,:) = mean(tmp);
end
%
weight = zeros(M,1);
for j = 1:M
weight(j) = sum(find(j==nn));
end
weight = weight/sum(weight);
%
mix.M = M;
mix.mean = mean; % M*SIZE
mix.var = var.^2; % M*SIZE
mix.weight = weight; % M*1
这里kmeans函数的返回值里nn为聚类中心,训练的第一遍为三个小数。但是其后的程序 ind = find(j==nn);无论如何也不会有非零输出的。这导致了最后的NaN结果吗?
当我加入断点执行后,经过第一次循环nn的值为
nn =
1.0e+003 *
0.0316
1.1496
2.6014
所以,问题的关键是j==nn的判据根本不可能成立。导致其后的ind为[],var为NaN。
我的理解对吗?网上很多人说法都不一样,有人说KMEANS大小写不对,有人说是训练数据不足……我觉得还是有问题,还有人说是matlab版本问题。我的matlab是2007a。
那位版大能支招啊,如果需要,小弟把全部源程序打包奉上。
真心求教。
谢谢。
HMM
可能是matlab中kmeans函数和voicebox中的kmeans函数不一样 在matlab中直接调用kmeans 我把voicebox中的函数 试了 但是还没调出来 交流交流啊 多谢回复啊我也下载了voicebox工具箱,kmeans的大小写都改过了
但是我觉得问题不是出现在这里。按照kmeans函数的定义,nn应该是聚类中心。
我设置了断点按步运行,在第一次循环的时候,nn的数值都是小数。(预计以后运行结果都会是小数的)
find函数的判据j==nn根本不会成立
因此ind是空值,var会为NaN
我已经做出了修改,总和概率输出也已经可以输出了,但是识别结果偏差特别大
总感觉是随机的结果。
可能我还是没有理解算法吧
你做什么方向?希望和你多讨论。 你好,请问运行matlab扩展编程第13章的inithmm.m程序后,为什么会出现下面的错误呢,谢谢~~~`
Improper index matrix reference.
Error in ==> inithmm at 24
T = size(samples(k).data,1);
联系方式:daisy848@163.com 回复 3 # reco 的帖子
楼主你好,我现在呢也是遇到这样的问题,请教一下,你是怎么样解决的,谢谢了,现在急需解决这个问题,期待你的答复
页:
[1]