HMM学习笔记

HMM学习笔记

0 前言#

隐马尔可夫模型(Hidden Markov Model,HMM)是一种经典的统计学模型,根本上属于传统机器学习中的概率图模型。学习该模型的前置知识为随机过程。

图片

1 定义#

1.1 概念引入#

图片

上图展示了隐马尔可夫链的基本元素和基本结构。隐马尔可夫的基本元素包含状态序列(state sequence)和观测序列(obervation sequence),状态序列一般不可知,或者说被隐藏起来了,故名马尔可夫链,观测序列一般可知。从结构上可知,状态变量和观测变量会随着时间而变化。描述这个变化的过程需要引入状态转移概率矩阵A观测概率矩阵B

1.2 变量定义#

设状态变量st的值域为Q={q1,q2,,qt,,qN},观测变量ot的值域为V={v1,v2,,vt,,vM}N=length(Q)M=length(V)

设序列长度为T,则状态序列S=(s1,s2,,st,,sT),观测序列O=(o1,o2,,ot,,oT)

定义状态转移概率矩阵

A=[aij]N×N

其中,aij=p(st+1=qj|st=qi),i=1,2,,N;j=1,2,,Naij是在时刻t处于状态qi条件下在时刻t+1转移到状态qj的概率。

定义观测概率矩阵

B=[bj(k)]N×M

其中,bj(k)=P(ot=vk|st=qj),k=1,2,,M;j=1,2,,Nbj(k)是在时刻t处于状态qj的条件下观测vk的概率。

定义初始概率向量

π=[πi]N×1

其中,πi=P(s1=qi),i=1,2,,Nπi是时刻t=1处于状态 qi的概率。

由此,可构建隐马尔可夫模型参数λ=(A,B,π)

1.3 两个基本假设#

  • (i)齐次马尔可夫性假设,即假设隐藏的马尔可夫链在任意时刻t的状态只依赖于前一时刻的状态,于其他时刻的状态及观测无关,也与时刻t无关。

    p(st|st1,,s1,ot,ot1,,o1)=p(st|st1)

  • (ii)观测独立性假设,即假设任意时刻的观测只依赖于该时刻的马尔可夫链的状态,与其他观测及状态无关。

    p(ot|sT,sT1,,s1,oT,oT1,,o1)=p(ot|st)

1.4 举例解释#

假设现有{盒子1,盒子2,盒子3,盒子4},每个盒子内含有若干数量不等的红球和白球。现在,观测者首先选择一个盒子,然后从该盒子里抽取一个球,获得该球的颜色,然后操作员会更换盒子,继续让观测者抽球。说明:盒子的更换规则观测者不知情。

那么,在这个例子中,观测者会获得一个关于小球颜色的序列,该序列就是观测序列;操作员依次更换盒子,操作员会得到一个关于盒子序号的序列,该序列就是对于观测者来讲就是状态序列,各个盒子中抽取红白球的概率会组成观测概率矩阵,盒子的更换方式会组成状态转移概率矩阵,观测者选择第一个盒子的概率分布称为初始状态概率向量

详细例子见《统计学习方法》,李航,清华大学出版社,P173

1.5 三个基本问题#

  • Evaluation:已知O,λ,求解p(O|λ)

  • Learning:已知O,求λ,使λMLE=argmaxλp(O|λ)

  • Decoding:已知O,λ,求S,使S^=argmaxSp(S|O,λ)

2 Evaluation Problem#

2.1 直接计算法#

p(O|λ)=Sp(S,O|λ)=Sp(O|S,λ)p(S|λ)

注:
边缘概率可以展开为联合概率的和;
联合概率可以展开为含有条件概率的形式;如P(AB)=P(A|B)P(B)

根据基本假设(i),可得

p(S|λ)=p(s1,s2,,st|λ)=p(st|s1,s2,,st1,λ)p(s1,s2,,st1|λ)=ast1stast2st1as1s2=πs1t=2Tast1,st

注:其中,ast1,st 表示从状态st1到状态st的转移概率,为了和1.2中的变量a_{ij}相对应,可以令i=locate(st1)j=locate(st),对应st1stQ(定义见1.2)中的位置序号,则ast1,st可以用aij表示,上式为了表述清晰,便直接使用状态变量代替了位置序号,与定义中的公式表达略有不同。

根据基本假设(ii),对于状态序列S=(s1,s2,,st,,sT),有

p(O|S,λ)=t=1Tbst(ot)

注:上式与aij类似,使用状态变量st表示状态变量在Q中的位置序号,使用观测变量ot表示观测变量在V(定义见1.2)中的位置序号。

于是有

p(O|λ)=Sπs1t=2Tast1,stt=1Tbst(ot)

对上述S做解释:这里的意思是对后面的含有s1,s2,,sT这些T个随机变量分别求均值再求和,即对状态变量求T次均值,每个状态变量都有N个取值,也就是说,计算上式需要进行NT个均值计算再求和,计算时间复杂度为O(NT)。随着T的增加,时间计算复杂度指数级增长。

2.2 前向算法#

给定λO=(o1,o2,,ot),定义:到时刻t观测序列为o1,o2,,ot且状态为qi的概率为前向概率,记为

αt(i)=p(o1,o2,,ot,st=qi|λ)

所以,

p(O|λ)=i=1Np(O,st=qi|λ)=i=1Nαt(i)

因此,欲求时刻t的p(O|λ),即求 αt(i)。可以通过递归的思想求解αt(i)

αt(j)=p(o1,o2,,ot,st=qj|λ)=i=1Np(o1,o2,,ot,st1=qi,st=qj|λ)=i=1Np(ot|o1,o2,,st1=qi,st=qj|λ)p(o1,,ot1,st1=qi,st=qj|λ)=i=1Np(ot|st=qj)p(o1,,ot,st1=qi,st=qj|λ)=i=1Np(ot|st=qj)p(st=qj|o1,,ot,st1=qi,λ)p(o1,,ot,st1=qi|λ)=i=1Np(ot|st=qj)p(st=qj|st1=qi)p(o1,,ot,st1=qi|λ)=i=1Nbj(ot)aijαt1(i)

可以看出来,上式依旧是使用了2.1使用过技巧

  • 将联合概率拆解为条件概率及其条件的概率的乘积
  • 利用基本假设(i)(ii)

因此,给定λ=(A,B,π),O=(o1,o2,,oT), 可得αt(i) 的初始条件 α1(i)

α1(i)=πibi(o1)

然后可以利用推导出的递归表达式计算出αt(1),αt(2),,αt(T),然后求和即可得到p(O|λ)。在每个递归式中,需要计算Nαt1(i),{i=1,2,,N},获得Nαt(i),{i=1,2,,N},则每个递归式的时间复杂度为O(N2),又观测序列的长度为T,即需要进行T次递归,则该算法的时间复杂度为O(N2T)

3 Decoding Problem#

decoding 问题就是根据观测序列求解最有可能的状态序列。

该问题的求解主要涉及到Viterbi Algorithm(维特比算法)。维特比算法是一种动态规划算法。它用于寻找最有可能产生观测事件序列的维特比路径——隐含状态序列。

定义:观测序列为o1,o2,,ot,模型参数为λ,到时刻t,状态变量stqi的概率最大,概率大小记为δt(i)

δt(i)=maxs1,,st1p(o1,,ot,s1,,st1,st=qi|λ)

相应的,可以推出

δt+1(j)=max1iN[δt(i)aij]bj(ot+1)

定义在时刻t+1状态为j的所有单个路径(j1,j2,,jt,jt+1)中概率最大的路径的第t+1个节点为

ψt+1(j)=argmax1iN[δt(i)aij]

代码示例

物理背景同1.4

clc
clear 
close all

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];
PI = [0.2; 0.4; 0.4];

lambda = {A, B, PI};

%红-1 白-2
O = [1 2 1];
%代码中的输入观测序列和输出状态序列需进行合理的数学编码,例如上述O代表{红,白,红},输出状态序列同理
my_viterbi(lambda, O)
function S_decode = my_viterbi(lambda, O)
    A = lambda{1, 1};
    B = lambda{1, 2};
    PI = lambda{1, 3};
    numO = length(O);
    S_decode = zeros(1, numO);

    % initialize
    N = length(PI);% number of states
    Psi = zeros(N, numO);
    Delta = zeros(N, numO);
    for i = 1:N
        Delta(i, 1) = PI(i) * B(i, O(1));
    end

    % recursive
    for k = 1:numO-1
        for i = 1:N
            temp = zeros(N,1);
            for j = 1:N
                temp(j) = Delta(j, k)*A(j,i);
            end
            [temp_max, max_index] = max(temp);
            Delta(i, k+1) = temp_max*B(i, O(k+1));
            Psi(i, k+1) = max_index;
        end
    end

    % end
    [temp_max, max_index] = max(Delta(:, end));
    P_decode_path = temp_max;
    tail_decode_point = max_index;

    % path traceback
    S_decode(numO) = tail_decode_point;
    for k = numO-1:-1:1
        S_decode(k) = Psi(S_decode(k+1), k+1);
    end
end

4 参考资料#

[1] b站机器学习白板推导系列[DB/OL]
[2] 统计学习方法[M].李航.清华大学出版社.2011.

作者:Baiyug

出处:https://www.cnblogs.com/Baiyug/p/18569816

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Baiyug  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu