例子的参数:
观察序列:
示例结果:
我的运行结果:
我的宏(viterbi)
%macroviterbi(obs);
prociml;
/*
M=2 观察状态数为2
N=3 隐含状态数为3
*/
/*用函数创建3*3方阵-这个例子的转移矩阵不是很好*/
/*A为转移矩阵*/
A=j(3,3,0.333);
/*B为发射矩阵*/
B={0.5 0.5,
0.75 0.25,
0.25 0.75};
/*用函数创建初始向量*/
pi=j(1,3,0.333);
/*创建单位矩阵,用于选择选举胜出的状态*/
vec=i(3);
/*初始状态*/
/*转移矩阵-不变*/
h=pi;
/*观察序列*/
os={&obs};
/*观察状态-确定性,第一次为os[1]*/
o=b[,os[1]]`;
/*发射-产生候选比较集*/
can1=h#o;
/*获取获胜隐含状态及概率*/
ws=can1[<:>];
pr=can1`;
do i=2 to ncol(os);
h_win=vec[ws[i-1],];
h=h_win*a;
/*观察状态*/
o=b[,os]`;
/*发射-产生候选比较集*/
can1=h#o;
/*获取获胜隐含状态及概率*/
ws=ws||can1[<:>];
pr=pr||can1`;
end;
printws;
printpr;
quit;
%mend;
%viterbi(1 1 1 1 2 1 2 2 2 2)