隨筆-23  評論-58  文章-0  trackbacks-0
          wikipedia上有個java版的Viterbi(維特比)實現程序(http://en.wikipedia.org/wiki/Viterbi_algorithm),但是3個觀察序列會標注出4個狀態序列。
          下面本人寫的這個Viterbi(維特比)實現程序就沒這個問題,3個觀察序列就只標注出3個狀態序列。
          public class Viterbi
          {
              
          public static void main(String[] args)
              
          {
                  String[] states 
          = {"Rainy""Sunny"};
                  String[] observations 
          = {"walk""shop""clean"};
                  
          double[] start_probability = {0.60.4};
                  
          double[][] transition_probability = {{0.70.3}{0.40.6}};
                  
          double[][] emission_probability = {{0.10.40.5}{0.60.30.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 閱讀(1994) 評論(0)  編輯  收藏 所屬分類: 機器學習

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 巍山| 乃东县| 尼玛县| 望都县| 景宁| 麻江县| 闽清县| 凤山县| 武威市| 定远县| 高陵县| 宜兰县| 唐山市| 临泉县| 巴林右旗| 佛冈县| 平泉县| 扎赉特旗| 武安市| 游戏| 岗巴县| 文山县| 鲁山县| 文成县| 旬阳县| 武穴市| 阳谷县| 怀来县| 称多县| 周宁县| 邹平县| 西畴县| 长岭县| 彩票| 永定县| 甘肃省| 林西县| 沅江市| 龙州县| 拉萨市| 塘沽区|