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. According to TLD or attribute directive in tag file, attribute value does not accept any expressions

    1.错误描写叙述 2014-7-13 17:27:21 org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one ...

  2. linux 常用 命令 笔记二

    wget 下载,得到网络上的内容 grep 文件搜索工具 EveryThing is a file in the linux system 安装 cowsay sudo apt-get install ...

  3. 获取被选择的radio的值

    function selectRadio() { var val = $('input:radio[name="address_select"]:checked').val(); ...

  4. HTTP协议5之代理--转

    代理服务器 Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演“中间人”的角色. HTTP的代理服务器即是Web服务器又是Web客户端. Fiddler就是 ...

  5. java面试大全

    JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时 ...

  6. Javascript的性能瓶颈

    Javascript是单线程的,它的性能瓶颈在于频繁的DOM操作, 因为每次操作都会使浏览器重新绘制一次. 其实纯JS的执行的速度是很快的,可以把元素都攒到一块,一次性放到页面中. 或者,定义一个延时 ...

  7. C# 4.0 并行计算部分

    C# 4.0 并行计算部分   c#linq算法多线程list微软   目录(?)[-] C 40 并行计算部分 一简单使用 二 并行循环的中断和跳出 三并行循环中为数组集合添加项 四返回集合运算结果 ...

  8. MJExtension(JSON到数据模型的自动转换)

    整理自:http://www.jianshu.com/p/93c242452b9b. 1.MJExtension的功能 字典-->模型 模型-->字典 字典数组-->模型数组 模型数 ...

  9. @synthesize

    @synthesize 相当于把属性当成成员变量来用,不用再写self.属性@synthesize myButton; 这样写了之后,那么编译器会自动生成myButton的实例变量,以及相应的gett ...

  10. C++语法报错收集

    1. error C2864: "OuterClass::m_outerInt": 只有静态常量整型数据成员才可以在类中初始化 class OuterClass { public: ...