wikipedia上有個java版的Viterbi(維特比)實(shí)現(xiàn)程序(
http://en.wikipedia.org/wiki/Viterbi_algorithm),但是3個觀察序列會標(biāo)注出4個狀態(tài)序列。
下面本人寫的這個Viterbi(維特比)實(shí)現(xiàn)程序就沒這個問題,3個觀察序列就只標(biāo)注出3個狀態(tài)序列。
public class Viterbi


{
public static void main(String[] args)

{

String[] states =
{"Rainy", "Sunny"};

String[] observations =
{"walk", "shop", "clean"};

double[] start_probability =
{0.6, 0.4};

double[][] transition_probability =
{
{0.7, 0.3},
{0.4, 0.6}};

double[][] emission_probability =
{
{0.1, 0.4, 0.5},
{0.6, 0.3, 0.1}};
forward_viterbi(observations,states,start_probability,transition_probability,emission_probability);
}
public static void forward_viterbi(String[] observations, String[] states,double[] start_probability, double[][] transition_probability, double[][] emission_probability)

{
int[][] path=new int[observations.length][states.length];
double[][] r=new double[observations.length][states.length];
for(int j=0;j<states.length;j++)

{
r[0][j]=start_probability[j]*emission_probability[j][0];
path[0][j]=0;
}
for(int t=1;t<observations.length;t++)

{
for(int i=0;i<states.length;i++)

{
double tmp=0;int m=0;
for(int j=0;j<states.length;j++)

{
double tem=r[t-1][j]*transition_probability[j][i]*emission_probability[i][t];
if(tem>tmp)

{
tmp=tem;
m=j;
}
}
r[t][i]=tmp;
path[t][i]=m;
}
}
double p=0;int m=0;
for(int i=0;i<r[0].length;i++)

{
if(r[r.length-1][i]>p)

{
p=r[r.length-1][i];
m=i;
}
}
System.out.println("p="+p);
int[] trace=new int[observations.length];
trace[observations.length-1]=m;
for(int t=observations.length-1;t>0;t--)

{
trace[t-1]=path[t][m];
m=path[t][m];
}
for(int i=0;i<trace.length;i++)
System.out.println(states[trace[i]]);
}
}。
posted on 2012-09-07 16:43
nianzai 閱讀(1987)
評論(0) 編輯 收藏 所屬分類:
機(jī)器學(xué)習(xí)