声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3223|回复: 4

[综合讨论] 求教HMM初始化(扩展编程)

[复制链接]
发表于 2009-4-14 09:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
小弟初做HMM,利用《matlab扩展编程》上的例程来跑。
但是一直出现总和输出概率为NaN的问题。
我在网上已经查了很久出错原因,大家给出的说法也是各种各样,还是来这里求个终解。
我自己用debug一步一步试过,在inithmm中发现了自己不明白的地方。
原程如下:
function mix = getmix(vector, M)

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

真心求教。
谢谢。
回复
分享到:

使用道具 举报

发表于 2009-4-14 17:08 | 显示全部楼层

HMM

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

评分

1

查看全部评分

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

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

你做什么方向?希望和你多讨论。
发表于 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
发表于 2011-12-4 09:54 | 显示全部楼层
回复 3 # reco 的帖子

楼主你好,我现在呢也是遇到这样的问题,请教一下,你是怎么样解决的,谢谢了,现在急需解决这个问题,期待你的答复
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-21 17:11 , Processed in 0.051587 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表