隐马尔科夫模型及MATLAB实现

Posted 好奇小圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隐马尔科夫模型及MATLAB实现相关的知识,希望对你有一定的参考价值。

隐马尔科夫模型

文章目录


前言

隐马尔科夫模型(HMM)是在马尔科夫链上的一个扩展,属于机器学习,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析


一、定义

隐状态集合:Q=q1,q2,…,qN
可观测态集合:V=v1,v2,…,vN
状态序列:I=i1,i2,…,iN
观察态序列:O=o1,o2,…,oN
状态转移矩阵:A=[aij]N*N ,其中aij=P(it+1=qj|it=qi)
观测状态生成矩阵:B=[bj(k)]N*M ,其中bj(k)=P(ot=vk|it=qt)
隐状态初始概率分布:Π=[π(i)]N ,其中π(i)=P(i1=qi)

由上得到HMM模型:λ=(A,B,Π)

二、三个基本问题

1、观测序列概率

已知λ=(A,B,Π),O=o1,o2,…,oN时,计算P(O|λ)的值。

穷举法
在该模型下,计算观测矩阵的概率,因此我们需要计算所有隐状态条件下的结果。既:
P(O|λ)=∑P(O|I,λ),
同时:
P(O|I,λ)=P(I|λ)P(O|I,λ),
其中:
P(I|λ)=πi1ai1i2ai2i3…aiT-1,iT
P(O|I,λ)=bi1(o1)bi2(o2)…biT(oT)
缺点:复杂度较大
前向后向算法

案例
案例来源
三个盒子,各有一定数量的红球白球

由此可以得到两个集合:

以及模型:

其中A:上一步在某个盒子拿,这一步拿各个盒子的概率
B:当拿某个盒子时,拿到红球、白球的概率
Π:初始拿各个盒子的概率
假设观测序列为O=红,白,红



求得最终结果:

2、模型参数学习

已知O=o1,o2,…,oN时,求λ=(A,B,Π)
利用期望最大值算法(Expectation-Maximum)

对π求估计:



对a和b求估计:

a的分子部分表示在O,λ已知时,该时刻处于隐状态i,并且下一时刻处于隐状态j的概率

3、预测(解码)问题

已知λ=(A,B,Π),O=o1,o2,…,oN时,求I=i1,i2,……,iN


δ既寻找到当前状态最大概率的一个路径。
Φ既在时刻t的时候,隐藏状态为i的,所有状态转移矩阵中,概率最大的那个转移路径中,第t-1个结点的隐藏状态。
接下来不断迭代:


最终得到最可能隐藏序列出现的概率

时刻T最可能的隐藏状态


就可以得到最终结果:最可能隐藏态序列

三、三个问题的代码

1、观测序列概率

依然以上述的小球和小盒模型为例,但是观察态序列包含五次观察结果,观测序列为白、红、红、白、白,结果P=0.0212

clear;clc;
box1=[0,0,0,0,0,1,1,1,1,1];%0表示红色,1表示白色
box2=[0,0,0,0,1,1,1,1,1,1];
box3=[0,0,0,0,0,0,0,1,1,1];
boxall=[box1;box2;box3];
O=[];
for i=1:5
    O=[O boxall(randi(30))];%生成观察态序列
end
%问题一
A=[0.5,0.2,0.3;0.3,0.5,0.2;0.2,0.3,0.5];%状态转移矩阵
B=[0.5,0.5;0.4,0.6;0.7,0.3];%观测状态生成矩阵
a=zeros(3,5);
pai=[0.2,0.2,0.4];
B_flag=1;%用于切换B的列数
if O(1)==0
    B_flag=1;
else
    B_flag=2;
end
a(:,1)=pai'.*B(:,B_flag);
for i=2:5
    if O(i)==0
        B_flag=1;
    else
        B_flag=2;
    end
        a(:,i)=(a(:,i-1)'*A)'.*B(:,B_flag);        
end
p=sum(a(:,5));

2、模型参数学习

在已知I和O时,可以用监督学习的方法实现:

clear;clc;
box1=[0,0,0,0,0,1,1,1,1,1];%0表示红色,1表示白色
box2=[0,0,0,0,1,1,1,1,1,1];
box3=[0,0,0,0,0,0,0,1,1,1];
boxall=[box1;box2;box3];
O=[];
I=[];
A=zeros(3,3);
B=zeros(3,2);
pai=zeros(1,3);
for i=1:30
    temp=randi(30);
    I=[I floor((temp-1)/10)+1];
    O=[O boxall(temp)];%生成观察态序列
end
%问题2监督学习法
j=1;
for i=2:30
    A(I(j),I(i))=A(I(j),I(i))+1;
    j=i;
end
A=A/29;
pai=[sum(sign(I==1))/30 sum(sign(I==2))/30 sum(sign(I==3))/30];
for i=1:30
    B(I(i),O(i)+1)=B(I(i),O(i)+1)+1;
end
B=B/30;

在未知I时,利用极大似然的方法实现

clear;clc;
A=[0.5,0.2,0.3;0.3,0.5,0.2;0.2,0.3,0.5];%状态转移矩阵
B=[0.5,0.5;0.4,0.6;0.7,0.3];%观测状态生成矩阵
initial=3;%初始状态
seq_len=100;%观察态序列长度
O= zeros(1,seq_len);
curr_state = initial;
for i = 1:seq_len
   O(i)	  = draw(B(curr_state,:));
   next_state = draw(A(curr_state,:));
   curr_state=next_state;
end
%问题2极大似然法
[newA,newB] = hmmtrain(O,A,B);%自己写的bug多多干脆用MATLAB自带的了


function index = draw(probabilities)

%根据概率向量选择一个类
N 	= 1000;
P	= cumsum(probabilities);
P	= round([0 P]*N);
I	= zeros(1,N);

for i = 1:length(probabilities)
   I(P(i)+1:P(i+1)) = i;
end

%混合向量
I	= I(randperm(N));

index = I(1);
end


总结

以上是关于隐马尔科夫模型及MATLAB实现的主要内容,如果未能解决你的问题,请参考以下文章

利用隐马尔科夫链(HMM)模型实现中文分词

机器学习算法之——隐马尔可夫模型(Hidden Markov Models,HMM) 代码实现

机器学习笔记十 隐马尔科夫模型(HMM)

隐马尔科夫模型

EM算法小波域隐马尔科夫树模型参数的EM算法估计MATLAB仿真

隐马尔科夫模型