1、随机初始化一组参数(0),根据后验概率Pr(Y|X;)来更新Y的期望E(Y),然后用E(Y)代替Y求出新的模型参数(1)。如此迭代直到趋于稳定。在HMM问题中,隐含变量自然就是状态变量,要求状态变量的期望值,其实就是求时刻ti观察到xi时处于状态si的概率,为了求此概率,需要用到向前变量和向后变量。向前变量向前变量是假定的参数它表示t时刻满足状态,且t时刻之前(包括t时刻)满足给定的观测序列的概率。1. 令初始值2. 归纳法计算3. 最后计算复杂度向后变量它表示在时刻t出现状态,且t时刻以后的观察序列满足1. 初始值2. 归纳计算E-Step定义变量为t时刻处于状态i,t+1时刻处于状态j的概
2、率。表示t时刻呈现状态i的概率。实际上是从其他所有状态转移到状态i的次数的期望值。是从状态i转移出去的次数的期望值。是从状态i转移到状态j的次数的期望值。M-Step是在初始时刻出现状态i的频率的期望值,是从状态i转移到状态j的次数的期望值 除以从状态i转移出去的次数的期望值,是在状态j下观察到活动为k的次数的期望值从其他所有状态转移到状态j的次数的期望值,然后用新的参数再来计算向前变量、向后变量、和。如此循环迭代,直到前后两次参数的变化量小于某个值为止。下面给出我的java代码: 1importjava.io.BufferedReader; 2importjava.io.File; 3imp
3、ortjava.io.FileReader; 4importjava.io.IOException; 5importjava.util.Arrays; 6importjava.util.HashMap; 7importjava.util.LinkedList; 8importjava.util.List; 9importjava.util.Map; 10importjava.util.Map.Entry; 11 12/* 13 * 隐马尔可夫模型参数学习。14 *15 * Author:zhangchaoyang 16 * Since:2015年4月4日17 * Version:1.018*/
4、 19publicclassHmmLearn 20 21privateintstateCount;/ 状态的个数 22private MapobserveIndexMap = newHashMap();/ 观察值及其索引编号 23/* 24 * 通过学习得到的模型参数 25*/ 26privatedouble stateProb;/ 初始状态概率矩阵 27privatedouble stateTrans;/ 状态转移矩阵 28privatedouble emission;/ 混淆矩阵 29 30private ListobserveSeqs = newLinkedList 1) / 长度为1的
5、观察序列必须过滤掉,不然在更新stateTrans时会出现NaN的情况 59observeSeqs.add(seq); 60for (inti = 0; iseq.length(); i+) 61 String observe = seq.substring(i, i + 1); 62if (!observeIndexMap.containsKey(observe) 63observeIndexMap.put(observe, observeCount+); 64 65 66 67 68 69br.close(); 70 71stateProb = newdoublestateCount; 7
6、2initWeightRandomly(stateProb, 1E5); 73/ initWeightEqually(stateProb); 74stateTrans = newdoublestateCount; 75for (inti = 0;stateCount; 76stateTransi = newdoublestateCount; 77initWeightRandomly(stateTransi, 1E5); 78/ initWeightEqually(stateTransi); 79 80 emission = newdoublestateCount; 81for (inti =
7、0; 82 emissioni = newdoubleobserveCount; 83initWeightRandomly(emissioni, 1E9); 84/ initWeightEqually(emissioni); 85 86 87 88/* 89 * 随机地初始化权重,使得各权重非负,且和为1. 90 * 91 * paramarr 92 * param precision 93*/ 94publicvoidinitWeightRandomly(double arr, double precision) 95intlen = arr.length - 1; 96int positi
8、on = newintlen; 97for (inti = 0;len; 98 positioni = (int) (Math.random() * precision); 99 100Arrays.sort(position);101int pre = 0;102for (inti = 0;103arri = 1.0 * (positioni - pre) / precision;104 pre = positioni;105 106arrlen = 1.0 * (precision - pre) / precision;107 108109/*110 * 均等地初始化权重,使得各权重非负,
9、且和为1.111 * 112 * paramarr113*/114publicvoidinitWeightEqually(double arr) 115intlen = arr.length;116for (inti = 0;117arri = 1.0 / len;118 119 120121/*122 * BaumWelch算法学习HMM的模型参数123*/124publicvoidbaumWelch() 125long begin = System.currentTimeMillis();126intiter = 0;127while (iter+ ITERATION_MAX) 128double stateProb_new = newdoublestateCount;129double stateTrans_new = newdoublestateCount;130double emission_new = newdoublestateCount;131for (inti = 0;132
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1