楼主: yukai08008
1755 3

[学习分享] HMM Viterbi算法3_SAS代码_Andy的原创帖20 [推广有奖]

  • 2关注
  • 17粉丝

讲师

2%

还不是VIP/贵宾

-

威望
0
论坛币
2176 个
通用积分
3.0600
学术水平
10 点
热心指数
7 点
信用等级
7 点
经验
5915 点
帖子
120
精华
0
在线时间
556 小时
注册时间
2012-11-28
最后登录
2022-4-11

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
重新包装好了Viterbi的宏代码,并且和维基百科里的例子进行了验证无误。但是通过百度搜索"维特比 例子"搜索到靠前的几个帖子有两个是错的,有兴趣可以验证一下。
维基百科: https://zh.wikipedia.org/wiki/维特比算法 (可能需要翻墙)
错误的例子一:http://blog.csdn.net/shijing_0214/article/details/51173887  (选择最佳路径后前推时使用了前向算法的公式)
错误的例子二:http://www.cnblogs.com/zhiranok/ ... /ymrkf_viterbi.html  (用Python写的,没细看,但是结果不对)
Viterbi宏代码(例子的HMM已经写入代码):
%macro viterbi(obs);
proc iml;
/*Healthy Fever*/
a1={0.7 0.3};
a2={0.4 0.6};
a=a1//a2;
/*Normal Cold Dizzy */
b1={0.5 0.4 0.1};
b2={0.1 0.3 0.6};
b=b1//b2;


pi={0.6 0.4};
os={&os};
vec=i(2);
/*t=1*/
/*隐藏状态*/
hs=pi;
/*观察向量*/
obs=b[,os[1]]`;
cand=hs#obs;
ws=cand[<:>];
pr=cand`;

/*t>=2*/
do i=2 to ncol(os);
h_win=vec[ws[i-1],]#pr[i-1]`;
/*h_win=vec[ws[i-1],];*/
hs=h_win*a;
/*根据观察状态选择发射向量*/
obs=B[,os]`;
/*hs与os点积获得隐藏状态的比较集*/
cand=hs#obs;
/*获取获胜隐含状态及概率*/
ws=ws||cand[<:>];
pr=pr||cand`;
end;
print ws pr;
/*store pr;*/
quit;
%mend;

调用宏可以得到:
%viterbi(1 2 3)
结果:
das.png
说明:  
ws中的1 1 2 代表healthy,healthy,fever
宏参数中的1 2 3 代表normal cold dizzy
pr则是每步的概率,结合GIF图可以对照验证。
Viterbi_animated_demo.gif
例子解释:

想象一个乡村诊所。村民有着非常理想化的特性,要么健康要么发烧。他们只有问诊所的医生的才能知道是否发烧。 聪明的医生通过询问病人的感觉诊断他们是否发烧。村民只回答他们感觉正常、头晕或冷。

假设一个病人每天来到诊所并告诉医生他的感觉。医生相信病人的健康状况如同一个离散马尔可夫链。病人的状态有两种“健康”和“发烧”,但医生不能直接观察到,这意味着状态对他是“隐含”的。每天病人会告诉医生自己有以下几种由他的健康状态决定的感觉的一种:正常、冷或头晕。这些是观察结果。 整个系统为一个隐马尔可夫模型(HMM)。

                           An_example_of_HMM.png

病人连续三天看医生,医生发现第一天他感觉正常,第二天感觉冷,第三天感觉头晕。 于是医生产生了一个问题:怎样的健康状态序列最能够解释这些观察结果。

另外就是维基中例子使用Python写的,看着比C语言(UMDHMM)写的简洁一些。

除掉矩阵的定义部分以及里面的print语句,我做了一下程序长度对比,python vs iml =570:221,总体来说用iml是更简洁一些的。







二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sas代码 ITER Andy HMM vit viterbi 维特比 例子

沙发
yukai08008 在职认证  发表于 2016-7-15 09:59:17 |只看作者 |坛友微信交流群
sorry, %macro viterbi(obs); 应该改为 %macro viterbi(os);
os宏变量代表输入观测的序列。

使用道具

藤椅
yukai08008 在职认证  发表于 2016-7-19 12:39:32 |只看作者 |坛友微信交流群
补充:
1 h_win=vec[ws[i-1],]#pr[i-1]`;  其中pr[,i-1]` 代表取列向量的转置,逗号丢了
2 obs=B[,os]`其中os应为os[i] ,似乎上传的过程被吞掉了。

使用道具

板凳
等风来撒 发表于 2017-2-27 11:17:14 |只看作者 |坛友微信交流群
请问有EM算法的吗,求教....

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-23 23:25