HMM的学习笔记1:前向算法
来源:互联网 发布:魔法王座升阶准确数据 编辑:程序博客网 时间:2024/06/01 08:58
HMM的学习笔记
HMM是关于时序的概率模型,描述由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测的随机过程。
HMM由两个状态和三个集合构成。他们分别是观测状态序列,隐藏状态序列,转移概率,初始概率和混淆矩阵(观察值概率矩阵)。
HMM的三个假设:
1、有限历史性假设,p(si|si-1,si-2,...,s1) = p(si|si-1)
2、齐次性假设,(状态与具体时间无关),P(si+1|si)=p(sj+1,sj)
3、输出独立性假设,输出仅与当前状态有关,P(o1,...ot|s1,...st) = P(ot|qt)
HMM需要解决三个问题:
1:评估问题,也就是给定一个观测序列,求它的概率;
2:解码问题,通过维特比算法来做解码,求概率最大的隐藏概率;
3:学习问题,通过观测序列求参数;
现在针对第一个评估问题,通常我们采用前项算法来计算观测序列的概率;
为了解决这个时间复杂度比价高的问题,首先定义一个前向变量,便是从1到t,输出符号O序列,t时刻处于状态i的累计输出概率。
这里每一次的at(i),我们是通过at(ij-1)来计算的,这样避免了重复计算。
状态转移概率矩阵
混淆概率矩阵
还有一个初始概率矩阵我们设为(1,0, 0)吧。
有了他们我们就可以计算at(i)。
这个过程说白了就是从某个点开始,几次计算到下一个点的概率,然后累加到下一个点上去。这里要注意的一点是初始的那个点计算,只是初始矩阵和混淆矩阵的运算(不涉及转移的过程)。
代码实现了一下前项算法:
和我们手工的计算一样
int get_index(char sz){if ( 'a' == sz){return 0;} else{return 1;}}void testa(){ifstream in_a("A.txt");double start[3] = {1, 0, 0};double A[3][3] = {0};double B[3][2] = {0};double C[3][4] = {0};char sz_array[] = "abab";int i, j, k;double (*p)[3];(p) = A;int row, col;in_a >> row >> col;for (i = 0; i < row; ++i){for (j = 0; j < col; ++j){in_a >> A[i][j];}}in_a >> row >> col;for (i = 0; i < row; ++i){for (j = 0; j < col; ++j){in_a >> B[i][j];}}in_a >> row >> col;for (i = 0; i < 3; ++i){for (j = 0; j < 4; ++j){in_a >> C[i][j];}}//// 初始化//for (i = 0; i < 3; ++i){C[i][0] = B[i][get_index(sz_array[0])] * start[i];}for (i = 1; i < 4; ++i){for (j = 0; j < 3; ++j){for (k = 0; k < 3; ++k){C[k][i] += C[j][i-1] * A[j][k] * B[k][get_index(sz_array[i])];}}}for (int m = 0; m < 3; ++m){for (int n = 0; n < 4; ++n){cout << C[m][n] << " ";}cout << endl;}in_a.close();}
0 0
- HMM的学习笔记1:前向算法
- HMM学习笔记—001--前向算法(forward algorithm)
- HMM学习笔记_2(从一个实例中学习HMM前向算法)
- HMM学习笔记_2(从一个实例中学习HMM前向算法)
- HMM学习笔记_2(从一个实例中学习HMM前向算法)
- HMM学习笔记_2(从一个实例中学习HMM前向算法)
- HMM学习笔记_2(从一个实例中学习HMM前向算法)
- HMM学习笔记_2(从一个实例中学习HMM前向算法)
- HMM学习笔记_2(从一个实例中学习HMM前向算法)
- HMM学习最佳范例五:前向算法1
- HMM学习最佳范例五:前向算法1
- hmm-前向算法
- hmm-前向算法
- HMM前向算法复杂度的分析
- HMM学习最佳范例七:前向-后向算法
- HMM前向算法和后向算法的推导
- 机器学习笔记(十四)——HMM估计问题和前向后向算法
- HMM:前向算法实例
- _cdecl 和_stdcall
- [Leetcode]Majority Element
- Pancake Sorting问题研究与优化
- python正则表达式 分割字符串
- SPFA 求带负权的单源最短路
- HMM的学习笔记1:前向算法
- GDI
- vmware提示:此虚拟机似乎正在使用中,无法取得所有权的解决办法
- 小马哥----高仿三星i8552刷机 详细拆机主板图与开机界面图。2015新主版机 4.12系统
- 排序
- 阿里电话面试被虐经历
- 软件开发之道
- decompress in memory data
- 空三匹配和密集匹配的区别与联系