隨筆-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)  編輯  收藏 所屬分類: 機器學習

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


          網站導航:
           
          主站蜘蛛池模板: 榆中县| 泗洪县| 青阳县| 呼伦贝尔市| 册亨县| 普兰县| 永修县| 徐闻县| 伽师县| 克拉玛依市| 重庆市| 上饶市| 中超| 汾西县| 铜鼓县| 义马市| 平潭县| 沾化县| 东明县| 青阳县| 满城县| 曲沃县| 三江| 弥渡县| 梁平县| 安义县| 密山市| 眉山市| 阜宁县| 达州市| 修水县| 西畴县| 青冈县| 四会市| 蓝田县| 秦皇岛市| 津市市| 家居| 乌海市| 扬州市| 开原市|