HMM隐马尔科夫模型及MATLAB实现

隐马尔科夫模型

文章目录

  • 隐马尔科夫模型
  • 前言
  • 一、定义
  • 二、三个基本问题
    • 1、观测序列概率
    • 2、模型参数学习
    • 3、预测(解码)问题
  • 三、三个问题的代码
    • 1、观测序列概率
    • 2、模型参数学习
  • 总结


前言

隐马尔科夫模型(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)
缺点:复杂度较大
前向后向算法
HMM隐马尔科夫模型及MATLAB实现_第1张图片
案例
案例来源
三个盒子,各有一定数量的红球白球
HMM隐马尔科夫模型及MATLAB实现_第2张图片
由此可以得到两个集合:
在这里插入图片描述
以及模型:
HMM隐马尔科夫模型及MATLAB实现_第3张图片
其中A:上一步在某个盒子拿,这一步拿各个盒子的概率
B:当拿某个盒子时,拿到红球、白球的概率
Π:初始拿各个盒子的概率
假设观测序列为O={红,白,红}
在这里插入图片描述
HMM隐马尔科夫模型及MATLAB实现_第4张图片
在这里插入图片描述
求得最终结果:
在这里插入图片描述

2、模型参数学习

已知O={o1,o2,…,oN}时,求λ=(A,B,Π)
利用期望最大值算法(Expectation-Maximum)HMM隐马尔科夫模型及MATLAB实现_第5张图片
HMM隐马尔科夫模型及MATLAB实现_第6张图片
对π求估计:
HMM隐马尔科夫模型及MATLAB实现_第7张图片
HMM隐马尔科夫模型及MATLAB实现_第8张图片
HMM隐马尔科夫模型及MATLAB实现_第9张图片
对a和b求估计:
HMM隐马尔科夫模型及MATLAB实现_第10张图片
a的分子部分表示在O,λ已知时,该时刻处于隐状态i,并且下一时刻处于隐状态j的概率
HMM隐马尔科夫模型及MATLAB实现_第11张图片

3、预测(解码)问题

已知λ=(A,B,Π),O={o1,o2,…,oN}时,求I={i1,i2,……,iN}
HMM隐马尔科夫模型及MATLAB实现_第12张图片
HMM隐马尔科夫模型及MATLAB实现_第13张图片
δ既寻找到当前状态最大概率的一个路径。
Φ既在时刻t的时候,隐藏状态为i的,所有状态转移矩阵中,概率最大的那个转移路径中,第t-1个结点的隐藏状态。
接下来不断迭代:
HMM隐马尔科夫模型及MATLAB实现_第14张图片
在这里插入图片描述
最终得到最可能隐藏序列出现的概率
在这里插入图片描述
时刻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,机器学习)