Matlab 隐马尔可夫模型应用

转贴自:http://www.aiseminar.cn/html/96/t-596.html

 

此文讲述的内容在Matlab 7.0、7.5(R2007b)中均有——马尔可夫工具箱,主要内容如下。

简介:马尔可夫处理是随机处理的一个典型例子——此种处理根据特定的概率产生随机输出或状态序列。马尔可夫处理的特别之处在于它的无记忆性——他的下一个状态仅依赖他的当前状态,不考虑导致他们的历史。马尔可夫处理的模型在实际应用中使用非常广泛,从每日股票价格到染色体中的基因位置都有应用。

马尔可夫链

马尔可夫模型用状态图可视化描述如下。


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.9000    0.1000
    0.0500    0.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.1667    0.1667    0.1667    0.1667    0.1667    0.1667
    0.5833    0.0833    0.0833    0.0833    0.0833    0.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.9065    0.0935
    0.0406    0.9594
EMIS_EST =
    0.1452    0.1516    0.1581    0.1968    0.1581    0.1903
    0.5841    0.0754    0.0986    0.0812    0.0841    0.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.9207    0.0793
    0.0370    0.9630
EMIS_EST2 =
    0.1792    0.1437    0.1436    0.1855    0.1509    0.1971
    0.5774    0.0775    0.1042    0.0840    0.0859    0.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简译!

你可能感兴趣的:(Matlab 隐马尔可夫模型应用)