Matlab|Matlab 隐马尔可夫模型应用
转贴自:http://www.aiseminar.cn/html/96/t-596.html
此文讲述的内容在Matlab 7.0、7.5(R2007b)中均有——马尔可夫工具箱,主要内容如下。
简介:马尔可夫处理是随机处理的一个典型例子——此种处理根据特定的概率产生随机输出或状态序列。马尔可夫处理的特别之处在于它的无记忆性——他的下一个状态仅依赖他的当前状态,不考虑导致他们的历史。马尔可夫处理的模型在实际应用中使用非常广泛,从每日股票价格到染色体中的基因位置都有应用。
马尔可夫链
马尔可夫模型用状态图可视化描述如下。
【Matlab|Matlab 隐马尔可夫模型应用】
MarkovModel.jpg
在图中,矩形代表你要描述的模型在处理中可能出现的状态,箭头描述了状态之间的转换。每个箭头上的标签表明了该转换出现的概率。在处理的每一步,模型都可能根据当前状态产生一种output或emission,然后做一个到另一状态的转换。马尔可夫模型的一个重要特点是:他的下个状态仅仅依赖当前状态,而与导致其成为当前状态的历史变换无关。
马尔可夫链是马尔可夫模型的一组离散状态集合的数学描述形式。马尔可夫链特征归纳如下:
1. 一个状态的集合{1, 2, ..., M}
2. 一个M * M的转移矩阵T,(i, j)位置的数据是从状态i转到状态j的概率。T的每一行值的和必然是1,因为这是从一个给定状态转移到其他所有可能状态的概率之和。
3. 一个可能的输出(output)或发布(emissions)的集合{S1, S2, ..., SN}。默认情况下,发布的集合是{1, 2, ..., N},这里N是可能的发布的个数,当然,你也可以选择一个不同的数字或符号的集合。
4. 一个M * N的发布矩阵E,(i, k)入口给出了从状态i得到发布的标志Sk的概率。
马尔可夫链在第0步,从一个初始状态i0开始。接着,此链按照T(1, i1)概率转移到状态i1,且按概率E(i1, k1)概率发布一个输出S(k1)。因此,在前r步,状态序列(i1, i2, i3, ..., ir)和发布序列(Sk1, Sk2, ..., Skr)的可能的观测结果是
T(1, i1)E(i, k1), T(i1, i2)E(i2, k2), ..., T(ir-1, ir)E(ir, k)
隐马尔可夫模型
简介:隐马尔可夫模型相对马尔可夫模型的不同之处在于,你观测到一组发布序列,但是却不知道模型通过什么样的状态序列得到这样的发布。隐马尔可夫模型分析就是要从观测数据恢复出这一状态序列。
一个例子:考虑一个拥有2个状态和6个位置发布的马尔可夫模型。模型描述如下:
1. 一个红色骰子,有5个面,标记为1到6。
2. 一个绿色骰子,有12个面,有5个标记为2到6,余下的全标记为1。
3. 一个加权的红硬币,正面的概率是0.9,背面的概率是0.1。
4. 一个加权的绿硬币,正面的概率为0.95,背面的概率为0.05。
这个模型按照下面的规则从集合{1, 2, 3, 4, 5, 6}产生一个数字序列:
1. 从滚动红骰子开始,记下出现的数字,作为发布结果。
2. 投红硬币:
如果结果是正面,滚动红骰子,记下结果;
如果结果是背面,滚动绿骰子,记下结果。
3. 在下面的每一步,你都抛和前一步所投骰子相同颜色的硬币。如果硬币出现正面,滚和硬币相同颜色的骰子。如果硬币出现反面,改为投另种颜色的骰子。
这个模型的状态图如下,有两个状态,红和绿:
HiddenMarkovModels.jpg
通过投掷和状态一样颜色的骰子来解决输出(发布),通过抛同样颜色的硬币来决定状态的转移。
状态转移概率矩阵为:
>> T = [0.9 0.1;
0.05 0.95]
T =
0.90000.1000
0.05000.9500
输出或发布概率矩阵为:
>> E = [1/6 1/6 1/6 1/6 1/6 1/6;
7/12 1/12 1/12 1/12 1/12 1/12]
E =
0.16670.16670.16670.16670.16670.1667
0.58330.08330.08330.08330.08330.0833
这个模型并不是隐藏的,因为我们从硬币和骰子的颜色已经知道状态序列。假设,有其他人产生了一个发布结果,而没有向你展示硬币和骰子,你能看到的只有结果。当你看到1比其他数字多时,你也许猜测这个模型是在绿色状态,但是因为你不能看到被投骰子的颜色,所以你并不能确定。
隐马尔可夫模型提出了如下问题:
1. 给定一个输出序列,最有可能的状态过程是什么?
2. 给定一个输出序列,如何估计模型的转移和发布概率?
3. 如何求这个模型产生一个给定序列的先验概率?
4. 如何求这个模型产生一个给定序列的后验概率?
隐马尔可夫模型分析
统计工具箱包含5个与隐马尔可夫模型相关的函数:
hmmgenerate 从一个马尔可夫模型产生一个状态序列和输出序列;
hmmestimate 计算转移和输出的极大似然估计;
hmmtrain 从一个输出序列计算转移和输出概率的极大似然估计;
hmmviterbi 计算一个隐马尔可夫模型最可能的状态变化过程;
hmmdecode 计算一个给定输出序列的后验状态概率。
下面部分介绍如何使用这些函数来分析隐马尔可夫模型。
1. 产生一个测试序列
下面代码产生上面简介中模型的转移和输出矩阵:
TRANS = [.9 .1;
.05 .95;
];
EMIS = [1/6, 1/6, 1/6, 1/6, 1/6, 1/6;
...
7/12, 1/12, 1/12, 1/12, 1/12, 1/12];
要从模型产生一个随机的状态序列和输出序列,使用hmmgenerate:
[seq,states] = hmmgenerate(1000,TRANS,EMIS);
输出中,seq是输出序列,states是状态序列。hmmgenerate在第0步从状态1开始,在第一步转移到状态i1
,并返回i1作为状态的第一个入口。
2. 估计状态序列
给定了转移和输出矩阵TRANS和EMIS,函数hmmviterbi使用Viterbi算法计算模型给定输出序列seq最有可能
通过的状态序列:
likelystates = hmmviterbi(seq, TRANS, EMIS);
likelystates是和seq一样长的序列。计算hmmvertibi的精度如下:
sum(states == likelystates) / length(states)
ans =
0.8680
3. 估计转移和输出矩阵
函数hmmestimate和hmmtrain用于估计给定输出序列seq的转移和输出矩阵TRANS和EMIS。
使用hmmestimate
[TRANS_EST, EMIS_EST] = hmmestimate(seq, states)
TRANS_EST =
0.90650.0935
0.04060.9594
EMIS_EST =
0.14520.15160.15810.19680.15810.1903
0.58410.07540.09860.08120.08410.0768
由上面使用方式可知,hmmestimate函数需要事先知道了得到输出序列seq,以及得到此结果的状态变化序
列。
使用hmmtrain
如果不知道状态序列,但是知道TRANS和EMIS的初始猜测,那就可以使用hmmtrain来估计TRANS和EMIS。
假设已知如下初始猜测:
TRANS_GUESS = [.85 .15;
.1 .9];
EMIS_GUESS = [.17 .16 .17 .16 .17 .17;
.6 .08 .08 .08 .08 08];
TRANS和EMIS的估计如下:
[TRANS_EST2, EMIS_EST2] = hmmtrain(seq, TRANS_GUESS, EMIS_GUESS)
TRANS_EST2 =
0.92070.0793
0.03700.9630
EMIS_EST2 =
0.17920.14370.14360.18550.15090.1971
0.57740.07750.10420.08400.08590.0710
hmmtrain使用迭代算法来不断修改TRANS_GUESS和EMIS_GUESS,使得每一步修改得到的矩阵都更加可能产生观测序列seq。当前后两个两次迭代矩阵的变化在一个小的容错范围内时,迭代停止。如果算法无法达到容错的范围,则迭代到达一定次数时就会停止,并返回一个警告提示。默认的最大迭代次数为100。
如果算法达不到目标误差范围,则可以通过增加迭代次数和/或加大容错误差值来使其获得较合适结果:
改变迭代次数maxiter:hmmtrain(seq,TRANS_GUESS,EMIS_GUESS,'maxiterations',maxiter)
改变容错误差tol:hmmtrain(seq, TRANS_GUESS, EMIS_GUESS, 'tolerance', tol)
影响hmmtrain输出的矩阵可靠性的两点因素:
(1)算法收敛于局部极值,这点可以使用不同的初始猜测矩阵来尝试解决;
(2)序列seq太短而无法很好的训练矩阵,可以尝试使用较长的序列。
4. 估计后验状态概率(不太理解)
一个输出序列seq的后验状态概率是在特定状态下的模型产生在seq中一个输出的条件概率。假定seq已经给出,你可以使用hmmdecode得到后验状态概率。
PSTATES = hmmdecode(seq,TRANS,EMIS)
输出为一个M * N的矩阵。M是状态的个数,L是seq的长度。PSTATES(i, j)是模型在状态i时,产生seq第j个输出的条件概率。
参考文献:
[1] Matlab R2007b帮助文档,http://www.aiseminar.cn/bbs,jink2005简译!
推荐阅读
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- www和https://又被Chrome地址栏隐藏了
- 马尔伯里精品酒店
- 巴西补时绝杀内马尔掩面哭泣(差一点就成梅西第二了)
- 何以解忧,企业信息化、数字化选型焦虑之五·系统安全隐患大
- hough变换检测的matlab程序
- 爱拍美图-自拍美颜camera激萌神器
- 别在隐藏自己最真实的一面
- 与演讲谈恋爱的日子
- 孕期血糖有点高怎么办(如何控制孕期血糖?看完觉得隐隐作痛)