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. 多线程下不反复读取SQL Server 表的数据

    在进行一些如发送短信.邮件的业务时,我们常常会使用一个表来存储待发送的数据,由后台多个线程不断的从表中读取待发送的数据进行发送.发送完毕后再将数据转移到历史表中,这样保证待发送表的数据普通情况下不会太 ...

  2. [Immutable.js] Using fromJS() to Convert Plain JavaScript Objects into Immutable Data

    Immutable.js offers the fromJS() method to build immutable structures from objects and array. Object ...

  3. ThinkPHP整合百度Ueditor图文教程

    ThinkPHP整合百度Ueditor图文教程 ThinkPHP整合百度Ueditor,基于黄永成老师的视频说明的申明:最好大家都能写绝对路径的都写好绝对路径比如:window.UEDITOR_HOM ...

  4. PHP <<EOF EOF的使用方法

    PHP <<EOF EOF的使用方法 <?php     $name = '浅水游';     print <<<EOT             <html& ...

  5. Unity 图片的灰度处理

    我们平时在做项目时,经常遇到按钮的点击而且还要区分悬浮,点击,禁用的状态,美术要针对一张图片做多个状态图片,资源图片的数量也就增大了,那么打出的包的大小也就跟着上去了,所以我们可以针对原始图片进行Sh ...

  6. [HeadFirst-HTMLCSS入门][第十章div,span]

    新元素 <div>逻辑容器 能进行分组,等于用一个大的盒子进行包装 <span> 内联字符的逻辑分组 text-align 改变所有内联元素位置. 属性 center 居中 行 ...

  7. [core java学习笔记][第十章部署应用程序]

    第10章 部署应用程序和applet jar文件 Java Web Start 10.1 jar文件 jar文件就是一个压缩了类,图像和声音的ZIP压缩文件 创建一个新的JAR文件应该使用的常见命令格 ...

  8. java进程

    package com.process;   public class ProcessTest { public static void main(String[] args) { new Proce ...

  9. iOS开发~视图(UIView)与控件(UIControl)

    1.UIView类 1.什么是视图 看得见的都是视图 2.什么是控件 一种特殊的视图,都是UIControl的子类,不仅具有一定的显示外观,还能响应高级事件,与用户交互.严格意义上UILabel不是控 ...

  10. C# 操作系统防火墙

    很多时候,我们的程序是通过网络通信(如TCP或者UDP协议+端口),而将制作好的程序安装包给客户用时,发现会出现不能通信的现象(或者在这台电脑是可以的,却在另一台不可以),原因是防火墙阻止了,需要添加 ...