隐马尔科夫模型
前言
隐马尔科夫模型(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) 缺点:复杂度较大 前向后向算法 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c2ba3f06d9d14f46acc3dab18b6b3926.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aW95aWH5bCP5ZyI,size_20,color_FFFFFF,t_70,g_se,x_16) 案例 案例来源 三个盒子,各有一定数量的红球白球 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3bead18a632c4e9cb64b79aed07c4bf0.png) 由此可以得到两个集合: ![在这里插入图片描述](https://img-blog.csdnimg.cn/3f5f1d83c8614483a6b64b148ef8c6f0.png) 以及模型: ![在这里插入图片描述](https://img-blog.csdnimg.cn/a360ece8d6754dd989c2431499f87fd3.png) 其中A:上一步在某个盒子拿,这一步拿各个盒子的概率 B:当拿某个盒子时,拿到红球、白球的概率 Π:初始拿各个盒子的概率 假设观测序列为O={红,白,红} ![在这里插入图片描述](https://img-blog.csdnimg.cn/1c9d26d5bae143bda2438bfb922cb6ee.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/4f7706a7aefa453ab518eeb93194d69b.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/4d4e1ee35ac64357b7d751df2caa385f.png) 求得最终结果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/bf714eb0d9b84031a70fbc59fdd60d65.png)
2、模型参数学习
已知O={o1,o2,…,oN}时,求λ=(A,B,Π) 利用期望最大值算法(Expectation-Maximum)![在这里插入图片描述](https://img-blog.csdnimg.cn/516347059d254fa0915f9dd385c1ffeb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aW95aWH5bCP5ZyI,size_10,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/9c08b5084a8b486eaa24074ccb0f2811.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aW95aWH5bCP5ZyI,size_20,color_FFFFFF,t_70,g_se,x_16) 对π求估计: ![在这里插入图片描述](https://img-blog.csdnimg.cn/11126dbacd614893a8774893e0dd3ed2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aW95aWH5bCP5ZyI,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/71508691def34d68811ed1e9be16e49e.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/f1bf023e4a6e476d97c0440ff5a134af.png) 对a和b求估计: ![在这里插入图片描述](https://img-blog.csdnimg.cn/da3e8fbe4a8a4ffabb2a2ba00d0924bb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aW95aWH5bCP5ZyI,size_10,color_FFFFFF,t_70,g_se,x_16) a的分子部分表示在O,λ已知时,该时刻处于隐状态i,并且下一时刻处于隐状态j的概率 ![在这里插入图片描述](https://img-blog.csdnimg.cn/235a5639780a49089ed41bbf4dcc39d8.png)
3、预测(解码)问题
已知λ=(A,B,Π),O={o1,o2,…,oN}时,求I={i1,i2,……,iN} ![在这里插入图片描述](https://img-blog.csdnimg.cn/105c17ae6b704a808c41ace213ab762e.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/2f55c129eab7427d87244c4eeaf90e21.png) δ既寻找到当前状态最大概率的一个路径。 Φ既在时刻t的时候,隐藏状态为i的,所有状态转移矩阵中,概率最大的那个转移路径中,第t-1个结点的隐藏状态。 接下来不断迭代: ![在这里插入图片描述](https://img-blog.csdnimg.cn/ee03eaad844a44fc9037f6dbee2a8d88.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/17a56a655b2949c882cbd0a55a41d196.png) 最终得到最可能隐藏序列出现的概率 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b53664d0b8af494cbc8f317ff31aaee8.png) 时刻T最可能的隐藏状态 ![在这里插入图片描述](https://img-blog.csdnimg.cn/219f8a59f35a443aad593ca383e1335d.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/16e68e8cae82448691a6a6556d03ef8d.png) 就可以得到最终结果:最可能隐藏态序列 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d85f12f2c18d4e828890364564674b37.png)
三、三个问题的代码
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
总结
|