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. 设置Eclipse启动JDK

    打开eclipse安装目录下的eclipse.ini文件,将红色内容加入 -vm ../Java/jdk1.6.0_26/bin (或者指向具体目录:D:/software/jdk_1.8u91/bi ...

  2. iOS开发- 界面传值(1)-通知模式(广播)

    之后的几篇博客, 记录下不同界面间传值的经常使用办法. 这篇文章记录广播的方式. iOS的设计模式中,通知模式也是当中重要的模式之中的一个,Notification直译为通知,事实上本人认为叫做广播模 ...

  3. Linux系统守护进程详解ntsysv 可以关掉那些服务

    acpid, haldaemon, messagebus, klogd,network, syslogd  以上几个服务必须开启!其他的分析如下: 1.NetworkManager,NetworkMa ...

  4. Android-JNI编程-图文解析

    要想阅读并调试下文源码,首先要确保你的NDK环境是ok的:        编译环境:win7+Eclipse+ADT+SDK+NDK:基本用最新的就ok.        说明下,下文代码就是一个简单的 ...

  5. LabVIEW新手5大错误

    虽然NI LabVIEW软件长期以来一直帮助工程师和科学家们快速开发功能测量和控制应用,但不是所有的新用户都会遵循LabVIEW编程的最佳方法. LabVIEW图形化编程比较独特,因为只需看一眼用户的 ...

  6. SEO 外链 内链 的定义

    外链 外链就是指从别的网站导入到自己网站的链接.导入链接对于网站优化来说是非常重要的一个过程.导入链接的质量(即导入链接所在页面的权重)直接决定了我们的网站在搜索引擎中的权重. 外链是互联网的血液,是 ...

  7. ORA-00119: invalid specification for system parameter LOCAL_LISTENER

    重启oracle是提示错误ORA-00119: invalid specification for system parameter LOCAL_LISTENER. 解决方法: 命令查看错误信息:oe ...

  8. CentOS6.5 --安装orale 11g(下)

    (7)     建立Oracle系统用户和安装目录 创建一个主组oinstall和一个副组dba.命令如下: groupadd oinstall groupadd dba 创建oracle安装文件 m ...

  9. javascript无缝全屏轮播

    虽然平时能利用插件来实现,但是总是觉得,如果连个无缝轮播都写不出来,还玩个毛线: 其实现在还真的是玩毛线,因为代码都是别人的,不过嘛,很快就变成是我的啦! 代码还没封装成插件,其实我也还没弄清楚. 下 ...

  10. javascript 模仿回车键事件

    <script> $(function(){ var _login = function (){ var _name = $('#name'); var _password = $('#p ...