reco 发表于 2009-4-14 09:59

求教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。
那位版大能支招啊,如果需要,小弟把全部源程序打包奉上。

真心求教。
谢谢。

yingjiang 发表于 2009-4-14 17:08

HMM

可能是matlab中kmeans函数和voicebox中的kmeans函数不一样 在matlab中直接调用kmeans 我把voicebox中的函数 试了 但是还没调出来 交流交流啊

reco 发表于 2009-4-15 10:28

多谢回复啊
我也下载了voicebox工具箱,kmeans的大小写都改过了
但是我觉得问题不是出现在这里。按照kmeans函数的定义,nn应该是聚类中心。
我设置了断点按步运行,在第一次循环的时候,nn的数值都是小数。(预计以后运行结果都会是小数的)
find函数的判据j==nn根本不会成立
因此ind是空值,var会为NaN

我已经做出了修改,总和概率输出也已经可以输出了,但是识别结果偏差特别大
总感觉是随机的结果。
可能我还是没有理解算法吧

你做什么方向?希望和你多讨论。

alex848 发表于 2009-7-9 11:09

你好,请问运行matlab扩展编程第13章的inithmm.m程序后,为什么会出现下面的错误呢,谢谢~~~`
Improper index matrix reference.
Error in ==> inithmm at 24
T = size(samples(k).data,1);
联系方式:daisy848@163.com

qi050405133 发表于 2011-12-4 09:54

回复 3 # reco 的帖子

楼主你好,我现在呢也是遇到这样的问题,请教一下,你是怎么样解决的,谢谢了,现在急需解决这个问题,期待你的答复
页: [1]
查看完整版本: 求教HMM初始化(扩展编程)