隐马尔科夫模型java实现

上周微信公众号推荐了一篇文章叫隐马尔科夫中文词的文章,原文http://blog.csdn.net/u014365862/article/details/54891582

大概了看了下,讲的通俗易懂,这周还很忙,一直在做crf模型,周五比较闲,明天也五一,花了一下午的时间写了下代码实现

隐马尔科夫模型,代码中最好是用对手的形式,hmm一旦长了,数字变小,会产生问题,我看了下hanlp的hmm分词实现,就是用的

对数形式,具体看下代码吧,给小白理解,结合上面提到的算法原理,估计一下就能看明白:



package com.meituan.model.viterbi;

import java.util.Arrays;

public class ViterbiTest {

	public static void main(String[] args) {
		/*隐含层状态系列是1,2,3
		 *  O=(红,白,红),现在求隐含层的转移情况其中红记作0,白记为1
		 *  则观察变为0,1,0
		 * */
		double[] pi = { 0.2, 0.4, 0.4}; //初始矩阵 1,2,3的初始概率
		
		                // 1    2     3
		double[][] A = { { 0.5, 0.2, 0.3 }, //1
				         { 0.3, 0.5, 0.2 }, //2
				         { 0.2, 0.3, 0.5} };//3   隐含层内部转移矩阵
		
		                // 红   白
		double[][] B = {
				        { 0.5, 0.5 },  //1
				        { 0.4, 0.6},  //2
				        { 0.7, 0.3} };//3   发射矩阵
		
		int[] O={0,1,0};
		
		//weight横表示隐含成状态,竖方向表示观察状态值得状态
		
		double[][] weight=new double[A.length][O.length];
		//当t=0的时候开始计算,初始化
	
		  for(double p:pi){
			for(int i=0;iweight[j][t]){
						weight[j][t] = temp;
					}
				}
				
				
			}
		}
		
		//打印weight矩阵
		for(int i=0;i



0.1 0.027999999999999997 0.007559999999999999 

0.16000000000000003 0.05039999999999999 0.010079999999999999 

0.27999999999999997 0.041999999999999996 0.014699999999999998 


你可能感兴趣的:(java,机器学习)