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:学习问题,通过观測序列求參数。

如今针对第一个评估问题,通常我们採用前项算法来计算观測序列的概率;

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVtMjAwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

为了解决这个时间复杂度比价高的问题,首先定义一个前向变量,便是从1到t,输出符号O序列,t时刻处于状态i的累计输出概率。

这里每一次的at(i)。我们是通过at(ij-1)来计算的,这样避免了反复计算。

状态转移概率矩阵

混淆概率矩阵

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVtMjAwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

另一个初始概率矩阵我们设为(1,0, 0)吧。

有了他们我们就能够计算at(i)。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVtMjAwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这个过程说白了就是从某个点開始。几次计算到下一个点的概率。然后累加到下一个点上去。这里要注意的一点是初始的那个点计算,仅仅是初始矩阵和混淆矩阵的运算(不涉及转移的过程)。

代码实现了一下前项算法:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVtMjAwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

和我们手工的计算一样

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();
}

HMM的学习笔记1:前向算法的更多相关文章

  1. HMM模型学习笔记(前向算法实例)

    HMM算法想必大家已经听说了好多次了,完全看公式一头雾水.但是HMM的基本理论其实很简单.因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察 ...

  2. HMM模型学习笔记(维特比算法)

    维特比算法(Viterbi) 维特比算法  编辑 维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中.术语“维特比 ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集

    机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集 关键字:FPgrowth.频繁项集.条件FP树.非监督学习作者:米 ...

  4. 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析

    机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析 关键字:Apriori.关联规则挖掘.频繁项集作者:米仓山下时间:2018 ...

  5. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  6. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  7. [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)

    [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian) 贝叶斯公式 \[P(A\mid B) = \frac{P(B\mid A)P(A)}{P(B)}\] 我们把P(A)称为"先 ...

  8. 隐马尔可夫模型(HMM) 学习笔记

    在中文标注时,除了条件随机场(crf),被提到次数挺多的还有隐马尔可夫(HMM),通过对<统计学习方法>一书的学习,我对HMM的理解进一步加深了. 第一部分 介绍隐马尔可夫 隐马尔可夫模型 ...

  9. 隐马尔科夫模型(HMM)学习笔记二

    这里接着学习笔记一中的问题2,说实话问题2中的Baum-Welch算法编程时矩阵转换有点烧脑,开始编写一直不对(编程还不熟练hh),后面在纸上仔细推了一遍,由特例慢慢改写才运行成功,所以代码里面好多处 ...

随机推荐

  1. DreamWeaver文件保存时,提示"发生共享违例"问题的解决方法

    在学习牛腩老师的JS视频中,视频中的例子要求实现一个是23个3相乘的结果,在用Dreamweaver制作时,, <script language="javascript" t ...

  2. HTML基础知识笔记(一)

    HTML定义 HTML指的是超文本标记语言 HTML不是编程语言,而是标记语言 标记语言是一套标记标签 HTML是用标记标签来描述网页   HTML标签1 <html></html& ...

  3. codeforces 342C Cupboard and Balloons(公式题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud C. Cupboard and Balloons A girl named Xen ...

  4. (原)Eclipse中将JNI生成的so打包成jar的步骤

    说明:新人,对java不熟,见谅. 1. 新建工程,添加好native support,写好对应的文件(包括cpp文件,so文件和对应的java文件,此处称对应的java文件为SoJAR.java,) ...

  5. 轻量jquery框架之--组件交互基础设计

    概要 组件交互基础,即考虑在JQUERY对象下($)下扩展所有组件都需要用到的通用api,如ajax入口.对表单的操作.html片段加载.通用的配合datagrid通用的curd客户端对象等. 扩展a ...

  6. gulp压缩js

    1.安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 -> 配置gulpfile.js -> 运行任务 2.查看nodejs的版本号 3.npm ...

  7. css样式书写顺序

    这里推荐先写显示属性,再写自身属性,再写文字属性:并不代表非得按这个顺序写,但这种写法可以使css结构更清晰易读,修改起来比较方便. 而且在团队项目中能更好地提高效率. //显示属性 display ...

  8. [C++程序设计]用数组名作函数参数

    1. 用数组元素作函数实参 #include <iostream> using namespace std; int max_value(int x, int max) { return ...

  9. project euler 16:Power digit sum

    >>> sum([int(i) for i in str(2**1000)]) 1366 >>>

  10. Python学习笔记(1)——数组差集

    面试的时候被问到这样一个问题:有A.B两个数组,找出B中有A中没有的所有元素(换言之即是求差集B-A).当时比较紧张,用了最原始的双重嵌套循环逐个比较,很显然这种时间复杂度高达O(n2)的算法相当lo ...