机器学习系列:隐马尔可夫模型 (1)
2026/8/18 12:16:56 网站建设 项目流程

关于隐马尔可夫模型由于内容比较多,我们这里分三部分内容讲解,这里是第1部分。

一、 隐马尔可夫模型概述

隐马尔可夫模型(Hidden Markov Model,HMM)是一种关于时间序列的概率统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。 根据加州大学伯克利分校等海外权威机构的教学资料,它最早由 Leonard E. Baum 等人在 20 世纪 60 年代提出([1]),现在已成为语音识别、自然语言处理等领域的经典算法 。‌‌‌HMM‌可以用来处理‌按时间顺序排列的数据‌,其核心逻辑是通过‌看得见的信号‌去推测‌看不见的状态‌ ,即能做到“由表及里”的效果。

一个HMM系统,需要如下核心要素:

(1) 两大状态集合‌:隐藏状态集合(不可直接观测,比如晴天/雨天,但你看不到)、观测状态集合(可直接观测,比如你朋友今天散步/购物/清理,你能看到);

(2) ‌三个概率矩阵‌:初始状态概率分布(开始时处于各状态的概率)、状态转移概率矩阵(从一个状态变到另一个状态的概率)、观测概率矩阵(或发射概率矩阵,在某个状态下产生某个观测的概率),可简化用三元组λ=(π,A,B)表示。

一个HMM系统,需要如下三大核心假设:

(1)齐次马尔可夫性:任意时刻隐藏状态仅依赖前一时刻的隐藏状态;

(2)观测独立性:任意时刻观测状态仅依赖当前时刻隐藏状态;

(3)时齐性:概率分布不随时间变化。

HMM‌通常用一组或几组长度相同的观测样本序列来训练模型,其核心是通过‌所谓的Baum-Welch算法(即EM算法的特例)‌迭代优化模型参数,让观测序列的生成概率最大化。训练好一个HMM模型后,可以用所谓的Viterbi算法(动态规划方法)在某个观测序列上解码最优隐藏状态序列,也可以在测试集上还原出对应的隐藏状态序列,以计算出识别准确率、对数似然等指标,从而来评估模型性能。

HMM是‌在机器学习中是一种生成式模型。它通过学习观测序列和隐藏状态序列的联合概率分布P(X,Y)来建模数据生成过程,而非直接学习条件概率P(Y|X)的判别模型,这是生成模型的核心特征。HMM 最经典的应用领域是语音识别与处理,用于将声音信号转换为文字 。早期采用 GMM-HMM 框架,后来发展为 DNN-HMM 模型,使用深度神经网络提升准确率 。如 Apple 的 Siri、Google 的语音搜索等背后都有 HMM 技术的身影 。‌‌在自然语言处理‌也是典型的应用场景,它用于处理文本序列数据,理解语言结构 ,如中文分词与词性标注中,可将汉字作为观测,分词标签作为隐藏状态。在生物信息学与金融‌中也扩展应用到基因分析和时间序列预测 。如用于 DNA 序列比对、基因预测和演化历程推论 。还有如股票价格预测、故障诊断等涉及时序变化的场景 。

二、 模型的定义及相关问题

1. 模型的定义

HMM是关于时间序列的概率统计模型,其中包含具有马尔可夫性的隐藏的状态序列(state sequence),以及由各个状态按一定概率生成可观测的观测序列(observation sequence)这两个时间序列,两个序列的每一个位置可以看作是一个时刻。

HMM主要由初始状态概率分布、状态转移概率分布、观测概率分布确定。这里用Q表示是所有可能的状态的集合,V表示是所有可能的观测的集合,为便于用矩阵表示各个状态之间转移的概率,这里我们用不同的数字表示不同的状态或观测结果,即:

,

也就是说Q中有N个不同的状态,V中有M个不同的观测。记I是长度为T的状态序列,O是对应的观测序列,即:

,

这里,

用A表示状态转移概率矩阵:

其中,,即在时刻t处于状态i的条件下在时刻t+1转移到状态​j的概率。

用B表示观测概率矩阵(发射概率矩阵):

其中, 即在时刻t处于状态j的条件下生成观测k的概率。

为初始状态概率向量:

其中,, 表示时刻t=1处于状态i的概率。于是一个HMM的待估参数可以用三元组表示。注意:MATLAB 统计工具箱的 HMM 函数(如hmmdecodehmmviterbi)‌默认初始分布为确定性状态 1‌, 即

2. 两个基本假设

HMM模型需要两个基本假设 :

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

,

(2)观测独立性假设:即假设任意时刻的观测只依赖于该时刻的隐藏状态,与其他的观测和状态无关,即:

,

3. 三个基本问题

(1)概率计算问题: 已知模型参数和一组观测序列,计算观测序列出现的慨率,即

(2)学习问题: 已知观测序列,去估计模型参数,使得在该参数下观测序列概率最大,即用极大似然估计方法来估计参数

(3)解码问题(预测问题): 已知模型参数和观测序列,求对给定观测序列条件下使最大的状态序列, 即给定观测序列,求最有可能对应的状态序列

三个基本问题中,学习问题就是用样本(观测序列)去训练一个HMM模型,是核心问题。而学习问题的计算过程中需要用到概率计算问题的结果训练好一个HMM模型后就可以通过解码问题获得对应的状态序列。

三、概率计算问题

概率计算问题,即给定模型和观测序列,计算在模型参数下,观测序列出现的概率

1. 直接计算法

直接计算法就是利用全概率公式来计算,它通过列举所有可能的长度为T的状态序列,求各个状态序列和观测序列的联合概率,然后对所有可能的状态序列求和,得到, 即

其中状态序列的概率为:

, (齐次马尔可夫性)

详细推导过程如下:

...........

对状态序列和模型参数给定的条件下,观测序列的概率为

(观测独立性假设)

于是的计算如下:

然而,这种计算方式的计算量非常大,其复杂度为,因此是不可行的。在实际应用中,一般采用更有效的算法,即前向-后向算法。

2. 前向算法

给定模型参数,定义到达t时刻,观测序列为,且此时状态为的概率为前向概率,即:

这里的可以通过向前递推获得概率,流程如下:

(1)计算初值:

,

(2)递推: 对

(条件概率公式)

(观测独立性)

(全概率公式)

(条件概率公式)

,

现在可以利用前向概率计算

由于前向算法可以直接引用上一个时刻的计算结果,其时间复杂度是,比直接计算法小很多。

3. 后向算法

给定模型参数,定义到达t时刻,状态为的条件下,后续的观测序列为的概率称为向后概率,即:

同样地,这里的可以通过向后递推获得概率,流程如下:

(1)计算初值:

,

(2)递推: 对

(全概率公式)

(条件概率公式)

(观测独立性假设)

(条件概率公式)

现在也可以利用后向概率计算

也可以把前向概率和后向概率结合起来计算

以下给出前向算法和后向算法的MATLAB实现:

function [alpha,beta]=forwardbackward(Ok,PI,A,B) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %HMM模型之前向算法和后向算法的实现 %计算在某一个观测序列Qk下的前向概率alpha和后向概率beta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PI: 初始状态概率 %A: 状态转移概率矩阵 %B: 观测概率矩阵 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [s,T]=size(Ok); numStates=size(PI,1); %% 前向概率alpha alpha=zeros(T,numStates); %初始时刻:t=1 alpha(1,:)=PI(:,1).*B(:,Ok(1,1)); %前推 for t=2:T alpha(t,:)=(alpha(t-1,:)*A).*B(:,Ok(1,t))'; end %% 后向概率beta beta=zeros(T,numStates); %初始时刻:t=T beta(T,:)=1; %反推 for t=T-1:(-1):1 beta(t,:)=(A.*B(:,Ok(1,t+1))')*beta(t+1,:)'; end end

4. 两个概率值的计算

已知模型参数和观测序列,在时刻t处于状态的概率(即状态占用概率),记为:

计算

因为

所以

已知模型参数和观测序列,在时刻t处于状态且在时刻t+1处于状态的概率(状态转移概率),记为:

,

利用前向概率和后向概率计算

因为

(条件概率公式)

(观测独立性假设)

(条件概率公式)

(条件概率公式)

所以

,

5. 两个概率值的改进计算

两个概率值的计算由于涉及前向概率和后向概率的计算,而前向概率和后向概率的计算都是一系列递推过程,计算过程会带来舍入误差(主要是下溢)。以下给出一种改进的计算方法,可以有效地避免计算过程中的溢出问题。改进的计算方法是用缩放因子法计算前向概率即每时刻 t计算​后,立即除以该时刻的总和,归一化,并记录缩放因子。在计算时也用缩放因子来处理。 具体算法如下:

-------------------------------------------前向概率的改进计算-----------------------------------------------------------

(1) 初始(t=1): 计算,

计算归一化因子,

(2)对于 t=2,3,..., T, 计算:

,

,

(3)的恢复:

,,

---------------------------------------------------------------------------------------------------------------------------------

--------------------------------------后向概率的改进计算----------------------------------------------------------------

(1) 初始(t=T):,

(2) 对于 t=T-1,T-2,..., 2, 1, 计算:

(3)的恢复:

,

------------------------------------------------------------------------------------------------------------------------------

因为观测序列出现的概率:, 所以

有了以上的准备,这里就可以改进两个概率值的计算了。

,

,

以下给出MATLAB下的实现函数:

function [Gamma,Xi,logPseq,forwardS, backwardS, scale] = myHMMGammaXi(O,PI,A,B) % myHMMGammaXi: 计算后验概率 P(i_t = i |O,lambda) 和 P(i_t=i,i_{t+1}|O,lambda) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %输入: % O: 1*T, 长度是T的观测序列矩阵 % PI: N*1,参数PI的初步状态概率向量 % A: N*N, 状态转移概率矩阵 % B: N*M,观测概率矩阵(发射概率矩阵) %输出: % Gamma: N*T, 一个观测序列O下的状态后验概率(状态占用概率),即P(i_t=i |O, lambda) % Xi: N*N*(T-1), 一个观测序列O下的状态转移后验概率,即P(i_t=i,i_{t+1} |O, lambda) % forwardS: alpha的归一化 % backwardS: beta的归一化 % logPseq: 即P(O|lambda)的对数值 % scale: 归一化因子 %2026.8.14 MiaoZhh %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [N,M]= size(B); T=length(O); %为避免数据乘积过程下溢,引入缩放因子scale scale = zeros(1,T); forwardS=zeros(N,T); %% 前向概率计算(伸缩因子法) for i=1:N forwardS(i,1)=B(i,O(1))*PI(i,:); %forwardS(i,1)=B(i,O(1))*A(1,i); (hmmtrain采用) end scale(1) = sum(forwardS(:,1)); forwardS(:,1) = forwardS(:,1)./scale(1); for t=2:T for i = 1:N forwardS(i,t)= B(i,O(t)) .* (sum(forwardS(:,t-1) .*A(:,i))); end scale(t) = sum(forwardS(:,t)); forwardS(:,t) = forwardS(:,t)./scale(t); end %% 后向概率计算(伸缩因子法) backwardS = ones(N,T); for t=(T-1):(-1):1 for i = 1:N backwardS(i,t) = (1/scale(t+1)) * sum(A(i,:)'.* backwardS(:,t+1).*B(:,O(t+1))); end end %% Gammar_t(i) 状态占用后验概率 Gamma = forwardS.*backwardS; %% Xi 状态转移后验概率 Xi=zeros(N,N,T-1); for t=1:T-1 for i=1:N for j=1:N Xi(i,j,t)=forwardS(i,t)*A(i,j)*B(j,O(t+1))*backwardS(j,t+1)/scale(t+1); end end end %% 观测概率P(O|lambda)的对数值 logPseq = sum(log(scale)); end

未完,请继续参阅以下内容:

机器学习系列:隐马尔可夫模型(2)

参考文献

[1] Baum L E , Petrie T .Statistical Inference for Probabilistic Functions of Finite State Markov Chains[J].Annals of Mathematical Statistics, 1966, 37(6):1554-1563.DOI:10.1214/aoms/1177699147.

[2] 《统计学习方法(第2版)》 李航 著

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询