Java实现的隐马尔科夫模型中前向、后项和维特比算法.docx_第1页
Java实现的隐马尔科夫模型中前向、后项和维特比算法.docx_第2页
Java实现的隐马尔科夫模型中前向、后项和维特比算法.docx_第3页
Java实现的隐马尔科夫模型中前向、后项和维特比算法.docx_第4页
Java实现的隐马尔科夫模型中前向、后项和维特比算法.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

package com.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(int stateNum,int observationSymbolNum)N=stateNum;M=observationSymbolNum;A=new doubleNN;B=new doubleNM;PI=new doubleN;/前向算法package com.HMM.test;public class Forward extends HMMpublic Forward(int stateNum,int observationSymbolNum)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 doubleob.lengthN;/1.初始化,计算初始时刻所有状态的局部概率System.out.println(1.初始化:);for(int i=0;iN;i+)alpha0i=PIi*Biob0;System.out.println(alpha0+i+:+alpha0i);/2.归纳,递归计算每个时间点的局部概率System.out.println(2.归纳:);for (int i = 1; i ob.length; i+)/从第一个观测值开始循环, for (int j = 0; j N; j+)/对于每个状态 double sum = 0; for (int k = 0; k N; k+) sum += alphai - 1k * Akj; alphaij = sum * Bjobi; System.out.println(alpha+i+j+:+alphaij); /3.终止,观察序列的概率等于最终时刻所有局部概率之和String s=P(red,yellow,blue)=;System.out.println(3.终止,求和:);double probability = 0; for (int i = 0; i N; i+) probability += alphaob.length - 1i; s+=alpha+(ob.length - 1)+i+; if(i!=N-1) s+=+; System.out.println(s+=+probability); return probability;/后项算法package com.HMM.test;public class Backward extends HMMpublic Backward(int stateNum,int observationSymbolNum)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 doubleob.lengthN; / 初始化 System.out.println(1.初始化:); for (int i = 0; i = 0; t-) for (int j = 0; j N; j+) double Sum = 0; for (int i = 0; i N; i+) Sum += Aji * Biobt + 1 * betat + 1i; betatj = Sum; System.out.println(beta+t+j+:+betatj); / 终止 String s=P(red,yellow,blue)=;System.out.println(3.终止,求和:); double probability = 0; for (int i = 0; i N; i+) probability += beta0i; s+=beta0+i+; if(i!=N-1) s+=+; System.out.println(s+=+probability); return probability; /维特比算法package com.HMM.test;import java.util.ArrayList;import java.util.List;public class Viterbi extends HMMpublic Viterbi(int stateNum,int observationSymbolNum)super(stateNum,observationSymbolNum);/ob 已知的观察序列;probability 可能性最大的隐藏状态序列的概率;返回 可能性最大的隐藏状态序列public List viterbi(int ob, double probability) double delta = null; int psi = null; return viterbi(ob, delta, psi, probability); /delta 输出中间结果,局部最大概率;psi 输出中间结果,反向指针指示最可能路径;返回可能性最大的隐藏状态序列的概率public List viterbi(int ob, double delta, int psi,double probability) delta = new doubleob.lengthN; / 局部概率 psi = new intob.lengthN; / 反向指针 System.out.println(1.初始化:); / 1. 初始化 for (int j = 0; j N; j+) delta0j = PIj * Bjob0; System.out.println(delta0+j+:+delta0j); / 2. 递归 System.out.println(2.归纳:); for (int t = 1; t ob.length; t+) for (int j = 0; j N; j+) double MaxValue = deltat - 10 * A0j;/初始,设第0个状态处的值为最大值 int MaxValueIndex = 0;/存储取得最大值处的状态的索引 for (int i = 1; i MaxValue) MaxValue = Value; MaxValueIndex = i; deltatj = MaxValue * Bjobt; System.out.println(delta+t+j+:+deltatj); psitj = MaxValueIndex; / 记录下最有可能到达此状态的上一个状态 / 3. 终止 System.out.println(3.终止,回溯求最佳路径); int q= new intob.length; / 定义最佳路径 probability = deltaob.length - 10;/将第0个定义为最大的权值 qob.length - 1 = 0; for (int i = 1; i probability) probability = deltaob.length - 1i; qob.length - 1 = i;/最后一个时间点的最优状态 / 4. 路径回溯 for (int t = ob.length - 2; t = 0; t-) qt = psit + 1qt + 1; List list=new ArrayList(); list.add(q); list.add(probability); return list; /前向 后项和维特比算法测试package com.HMM.test;import java.util.List;public class TestHMM2 enum Box one,two,three ; / 隐藏状态(箱子编号) enum Color red,yellow,blue,green ; / 观察状态(观测到的颜色值) public static void main(String args) / 测试前向算法和后向算法/ CheckForwardAndBackward();/ Console.WriteLine(); / 测试维特比算法 CheckViterbi();/ Console.WriteLine(); / 测试前向算法和后向算法 static void CheckForwardAndBackward() / 状态转移矩阵 double A = 0.500, 0.375, 0.125, 0.250, 0.125, 0.625, 0.250, 0.375, 0.375 ; / 混淆矩阵 double B = 0.60, 0.20, 0.15, 0.05, 0.25, 0.25, 0.25, 0.25, 0.05, 0.10, 0.35, 0.50 ; / 初始概率向量 double PI = 0.63,0.17,0.20; / 观察序列 int OB = Color.red.ordinal(), Color.yellow.ordinal(), Color.blue.ordinal(); System.out.println(状态转移概率矩阵:); for(int i=0;iA.length;i+) for(int j=0;jA0.length;j+) System.out.print(Aij+t); System.out.println(); System.out.println(符号观测概率矩阵:); for(int i=0;iB.length;i+) for(int j=0;jB0.length;j+) System.out.print(Bij+t); System.out.println(); System.out.println(初始概率向量:+PI0+ +PI1+ +PI2+); System.out.println(隐藏状态序列:+Box.one+ +Box.two+ +Box.three+); System.out.println(观测序列:+Color.red+ +Color.yellow+ +Color.blue+); / 初始化HMM模型 Forward forward = new Forward(A.length, B0.length); forward.A=A; forward.B=B; forward.PI=PI; / 观察序列的概率 System.out.println(-前向算法-); double probability = forward.forward(OB); Backward backWard = new Backward(A.length, B0.length); backWard.A=A; backWard.B=B; backWard.PI=PI; / 观察序列的概率 System.out.println(-后向算法-); probability = backWard.backward(OB); / 测试维特比算法 static void CheckViterbi() / 状态转移矩阵 double A = 0.500, 0.250, 0.250, 0.375, 0.125, 0.375, 0.125, 0.675, 0.375 ; / 混淆矩阵 double B = 0.60, 0.20, 0.15, 0.05, 0.25, 0.25, 0.25, 0.25, 0.05, 0.10, 0.35, 0.50 ; / 初始概率向量 double PI = 0.63, 0.17, 0.20 ; / 观察序列 int OB = Color.red.ordinal(),Color.yellow.ordinal(), Color.blue.ordinal(), Color.yellow.ordinal(),Color.green.ordinal() ; System.out.println(状态转移概率矩阵:); for(int i=0;iA.length;i+) for(int j=0;jA0.length;j+) System.out.print(Aij+t); System.out.println(); System.out.println(符号观测概率矩阵:); for(int i=0;iB.length;i+) for(int j=0;jB0.length;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论