- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java实现的隐马尔科夫模型中前向、后项和维特比算法
packagecom.HMM.test;public class HMM {protected int N;//状态数protected int M;//观察符号数protected double[][] A;//状态转移概率protected double[][] B;//符号观测概率protected double[] PI;//初始状态概率分布public HMM(){};//参数1 状态数目;参数2 观察符号数目public HMM(intstateNum,intobservationSymbolNum){N=stateNum;M=observationSymbolNum;A=new double[N][N];B=new double[N][M];PI=new double[N];}}//前向算法packagecom.HMM.test;public class Forward extends HMM{public Forward(intstateNum,intobservationSymbolNum){super(stateNum,observationSymbolNum);}//ob是已知的观察序列;返回结果是观察序列的概率public double forward(int[] ob){double[][] alpha = null;return forward(ob,alpha);}//ob:已知的观察序列;alpha:输出中间结果,局部概率;返回观察序列的概率public double forward(int[] ob,double[][] alpha){alpha=new double[ob.length][N];//1.初始化,计算初始时刻所有状态的局部概率System.out.println(1.初始化:);for(inti=0;iN;i++){alpha[0][i]=PI[i]*B[i][ob[0]];System.out.println(alpha[0][+i+]:+alpha[0][i]);}//2.归纳,递归计算每个时间点的局部概率System.out.println(2.归纳:);for (inti = 1; i ob.length; i++)//从第一个观测值开始循环, { for (int j = 0; j N; j++)//对于每个状态 {double sum = 0;for (int k = 0; k N; k++) {sum += alpha[i - 1][k] * A[k][j]; }alpha[i][j] = sum * B[j][ob[i]];System.out.println(alpha[+i+][+j+]:+alpha[i][j]); } }//3.终止,观察序列的概率等于最终时刻所有局部概率之和String s=P(red,yellow,blue)=;System.out.println(3.终止,求和:);double probability = 0;for (inti = 0; i N; i++) {probability += alpha[ob.length - 1][i];s+=alpha[+(ob.length - 1)+][+i+];if(i!=N-1)s+=+; }System.out.println(s+=+probability);return probability;}}//后项算法packagecom.HMM.test;public class Backward extends HMM{public Backward(intstateNum,intobservationSymbolNum){super(stateNum,observationSymbolNum);}//ob已知的观察序列public double backward(int[] ob) { double[][] beta = null; // 只声明,不定义return backward(ob, beta); }//ob已知的观察序列;beta 后向变量;返回观测序列的概率public double backward(int[] ob,double[][] beta) { beta = new double[ob.length][N]; // 初始化System.out.println(1.初始化:);for (inti =
文档评论(0)