一、EM算法的介绍
1.什么是EM算法?
EM算法(Expectation-Maximization algorithm)是一种迭代算法,用于求解含有隐变量(latent variable)的概率模型参数估计问题。它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔科夫算法(HMM)等等。它被广泛应用于统计学和机器学习中,特别是在无监督学习中,如聚类、混合高斯模型等问题。
EM算法的目标是通过迭代优化的方式,最大化观测数据的似然函数(或最大化似然函数的对数),从而估计模型的参数。在这个过程中,存在隐变量,即一些无法直接观测到的变量。EM算法通过迭代的方式,通过先计算隐变量的期望(E步骤),然后调整模型参数以最大化似然函数(M步骤),不断更新参数估计值。
2.EM算法的计算步骤
- 初始化模型参数。
- E步骤(Expectation Step):根据当前参数估计值,计算隐变量的后验概率或期望。
- M步骤(Maximization Step):利用E步骤计算得到的隐变量的期望,更新模型参数,最大化似然函数。
- 重复执行E步骤和M步骤,直到满足停止条件(如达到最大迭代次数或参数收敛)。
- 输出最终的参数估计值。
EM算法的关键在于在E步骤中计算隐变量的期望,以及在M步骤中通过最大化似然函数来更新模型参数。这种迭代的过程可以逐步提高参数估计的准确性,从而得到更好的模型拟合结果。
3.什么是极大似然估计?
极大似然估计(Maximum Likelihood Estimation,MLE)是一种参数估计方法,用于从观测数据中估计出最有可能产生这些观测数据的模型参数。它基于概率论的思想,假设观测数据是从某个概率分布中独立地抽取得到的,并且通过最大化观测数据的似然函数来确定模型的参数值。
具体而言,假设我们有一组观测数据,要估计的是概率分布的参数(如均值、方差等)。极大似然估计的目标是找到能够使得观测数据的出现概率最大化的参数值。
假设观测数据为 X = {x₁, x₂, …, xₙ},概率分布的参数为 θ。观测数据的似然函数 L(θ|X) 表示在给定参数值 θ 下,观测数据 X 出现的概率。MLE的目标是找到最大化似然函数的参数值,即使得 L(θ|X) 最大的 θ。
通常情况下,为了方便计算,我们对似然函数取对数得到对数似然函数。因为对数函数是单调递增的,最大化似然函数等价于最大化对数似然函数。因此,MLE的目标可以转化为找到最大化对数似然函数的参数值。
一旦得到最大化似然函数的参数估计值,就可以使用这些参数进行预测或其他进一步的分析。
4.极大似然估计公式
给定独立同分布的观测数据 X₁, X₂, …, Xₙ,来自于具有参数 θ 的概率分布,极大似然估计(Maximum Likelihood Estimation,MLE)的公式可以表示为:
似然函数 L(θ) 定义为观测数据的联合概率密度函数(或概率质量函数):
L(θ) = f(X₁; θ) * f(X₂; θ) * … * f(Xₙ; θ)
其中 f(Xᵢ; θ) 表示观测数据 Xᵢ 的概率密度函数(或概率质量函数)。
通常使用对数似然函数来替代似然函数,以便于计算和优化。对数似然函数定义为似然函数的自然对数:
log L(θ) = log(f(X₁; θ)) + log(f(X₂; θ)) + … + log(f(Xₙ; θ))
极大似然估计的目标是找到最大化似然函数(或对数似然函数)的参数值 θ̂。换句话说:
θ̂ = argmax L(θ) 或 θ̂ = argmax log L(θ)
可以通过对似然函数(或对数似然函数)对参数 θ 求导并令导数为零,然后解方程得到 θ̂。在某些情况下,可以使用数值优化方法来找到最大似然估计。
最大似然估计 θ̂ 被认为是对于给定观测数据和假设的概率分布,最好的参数估计值。它提供了一个使得观测数据在指定模型下似然最大化的点估计。
5.极大似然估计的案例
假设我们有一枚硬币,我们想要估计这枚硬币正面朝上的概率 p。我们进行了一系列的投掷实验,记录下每次投掷的结果,1 表示正面朝上,0 表示反面朝上。我们得到了一组观测数据 X = {1, 0, 1, 1, 0, 1}。
在这个例子中,我们假设每次投掷是独立的,并且符合二项分布。二项分布是一种离散概率分布,表示在 n 次独立的二元试验中成功的次数,其中每次试验的成功概率为 p。
现在,我们的目标是通过观测数据 X 来估计硬币正面朝上的概率 p。我们可以使用极大似然估计来找到最有可能产生这些观测数据的参数值。
假设观测数据 X 的长度为 n,其中正面朝上的次数为 m。那么,观测数据的似然函数为:
L(p|X) = p^m * (1-p)^(n-m)
我们的目标是找到使得似然函数 L(p|X) 最大化的 p 值。为了方便计算,我们通常对似然函数取对数,得到对数似然函数:
log L(p|X) = m * log§ + (n-m) * log(1-p)
现在,我们的任务是找到最大化对数似然函数的 p 值。这可以通过求导或者通过观察函数的形状来得到。对于二项分布的情况,我们可以发现对数似然函数在 p = m/n 处取得最大值。
因此,通过极大似然估计,我们得到了硬币正面朝上的概率 p 的估计值为 m/n,其中 m 是观测数据中正面朝上的次数,n 是观测数据的总数。
通过这个简单的例子,我们可以看到极大似然估计的基本思想:寻找能够最大化观测数据的似然函数(或对数似然函数)的参数值,从而估计出最有可能产生这些观测数据的模型参数。在实际应用中,极大似然估计可以应用于更复杂的概率模型和更多的观测数据,用于参数估计和统计推断。
二、HMM模型的介绍
1.马尔科夫链
在机器学习中,马尔科夫链(Markov Chain)是个很重要的概念。马尔科夫链(Markov Chain),又称离散时间马尔科夫链(discrete-time Markov chain),因俄国数学家安德烈·马尔可夫得名。
马尔科夫链(Markov Chain)是一种数学模型,用于描述具有马尔科夫性质的随机过程。马尔科夫性质指的是在给定当前状态的情况下,未来状态的概率只依赖于当前状态,而与过去状态无关。
马尔科夫链由一组状态和状态之间的转移概率组成。每个状态代表系统或过程可能处于的一个特定情况,转移概率表示在某个状态下,系统转移到其他状态的概率。
马尔科夫链的特点是具有无记忆性,即未来状态的概率只取决于当前状态,与过去的状态序列无关。这意味着马尔科夫链的演化过程是按照一步一步的转移进行的,每一步的转移仅依赖于当前状态。
马尔科夫链的数学表示为:
P
(
x
(
t
+
1
)丨
⋅
⋅
⋅
,
x
(
t
−
2
),
x
(
t
−
1
),
x
(
t
))
=
P
(
x
(
t
+
1
)丨
x
(
t
))
P(x(t+1)丨···,x(t-2),x(t-1),x(t))=P(x(t+1)丨x(t))
P(x(t+1)丨⋅⋅⋅,x(t−2),x(t−1),x(t))=P(x(t+1)丨x(t))
既然某一时刻状态转移的概率只依赖前一个状态,那么只需要求出系统中任意两个状态之间的转移概率,这个马尔科夫链的模型就定了。
马尔科夫链在许多领域有广泛的应用,包括自然语言处理、图像处理、机器学习等。通过对马尔科夫链进行建模和分析,可以研究系统的状态演化、预测未来状态、计算平稳分布等问题。
2.举例说明马尔科夫链
当我们考虑一个简单的天气模型时,我们可以将天气分为两种状态:晴天(Sunny)和雨天(Rainy)。我们将这两种状态作为马尔科夫链的状态。
假设我们有以下状态转移矩阵 P:
Sunny Rainy
Sunny 0.8 0.2
Rainy 0.4 0.6
这意味着在晴天的情况下,下一天是晴天的概率为 0.8,是雨天的概率为 0.2。同样,在雨天的情况下,下一天是晴天的概率为 0.4,是雨天的概率为 0.6。
假设我们的初始状态概率分布为:
- 初始天气为晴天的概率为 0.6,为雨天的概率为 0.4。
现在,可以使用这些信息来模拟天气的状态。假设今天是晴天(初始状态),我们可以根据状态转移矩阵计算明天的天气状态。
在第一天晴天的情况下,下一天是晴天的概率为 0.8,是雨天的概率为 0.2。因此,明天是晴天的概率为 0.8,是雨天的概率为 0.2。
我们可以继续进行类似的计算来预测未来的天气状态。每一天的天气状态仅依赖于前一天的天气状态,而与更早的天气状态无关。
这就是一个简单的马尔科夫链模型,它描述了天气状态的转移概率。通过观察一系列天气状态,我们可以利用马尔科夫链来推断未来的天气状态或分析天气状态之间的关联性。
3.什么是HMM模型?
HMM(Hidden Markov Model)模型是一种统计模型,用于建模和分析由隐含的状态序列生成的可观测序列的概率模型。HMM模型假设系统中存在一个不可见的状态序列,每个状态生成一个可观测的输出。
HMM模型由两个基本部分组成:状态转移概率和观测概率(输出概率)
- 状态转移概率:描述了在给定状态下系统从一个状态转移到另一个状态的概率。
- 观测概率(输出概率):描述了在给定状态下系统生成特定观测的概率。
HMM模型需要具备的要素:
- 状态集合:表示系统可能处于的状态的集合。
- 初始状态概率分布:表示系统的初始状态的概率分布。
- 状态转移概率矩阵:描述系统从一个状态转移到另一个状态的概率。
- 观测集合:表示系统可能生成的观测的集合。
- 观测概率矩阵:描述系统在给定状态下生成特定观测的概率。
HMM模型常用于序列数据的建模和分析,如语音识别、自然语言处理、手写识别等领域。在HMM模型中,通过观测序列来推断最可能的状态序列,或者根据状态序列生成对应的观测序列。
4.什么样的问题需要HMM模型
使用HMM模型时我们的问题一般有这两个特征:
-
我们的问题是基于序列的,比如时间序列,或者状态序列。
-
我们的问题中有两类数据:
- 一类序列数据是可以观测到的,即观测序列
- 另一类数据是不能观测到的,即隐藏状态序列简称状态序列
有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。
- 比如:在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏状态序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型。
5.HMM模型的两个重要假设
-
齐次马尔科夫链假设
- 即任意时刻的隐藏状态只依赖于它前一个隐藏状态。
- 当然这样假设有点极端,因为很多时候我们的某一个隐藏状态不仅仅只依赖于前一个隐藏状态,可能是前两个或者是前三个。
- 但是这样假设的好处就是模型简单,便于求解。
- 即任意时刻的隐藏状态只依赖于它前一个隐藏状态。
-
观测独立性假设
- 即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态,这也是一个为了简化模型的假设。
一个HMM模型,可以由隐藏状态初始概率分布π,状态转移概率矩阵A和观测状态概率矩阵B决定
6.HMM模型实例
当我们考虑一个简单的语音识别问题时,我们可以使用HMM模型来建模和解决这个问题。假设我们有一个包含三个状态的HMM模型,表示三个可能的语音信号:静音(Silent)、辅音(Consonant)和元音(Vowel)。
目标是根据观测到的语音信号序列,推断出最可能的隐藏状态序列,即最可能的语音信号类型序列。
假设我们有以下HMM模型的参数:
-
状态集合:{Silent, Consonant, Vowel}
-
初始状态概率分布:π = [0.4, 0.3, 0.3],表示初始时处于静音状态的概率为 0.4,辅音状态的概率为 0.3,元音状态的概率为 0.3。
-
状态转移概率矩阵A:
Silent Consonant Vowel Silent 0.6 0.4 0 Consonant 0.3 0.6 0.1 Vowel 0 0.4 0.6
这表示在当前状态下,转移到其他状态的概率。
-
观测集合:{A, B, C},表示观测到的语音信号的集合。
-
观测概率矩阵B:
A B C Silent 0.1 0.3 0.6 Consonant 0.4 0.4 0.2 Vowel 0.6 0.3 0.1
这表示在给定状态下,生成不同观测的概率。
假设我们观测到一个语音信号序列为 {B, C, A},我们想要根据这个观测序列推断最可能的隐藏状态序列。
可以使用维特比算法来计算最可能的隐藏状态序列。维特比算法使用动态规划的方式,在每个时间步骤上计算最可能的状态序列。
根据观测到的语音信号序列 {B, C, A},我们可以计算每个时间步骤的最可能状态。通过比较每个时间步骤的状态概率,可以确定最可能的状态序列。
在这个例子中,根据维特比算法的计算,我们可以得到最可能的隐藏状态序列为 {Consonant, Vowel, Vowel}。这表示在给定观测序列的情况下,最可能的语音信号类型序列是辅音、元音、元音。
7.HMM模型中,常见的问题分类:
- 评估问题(Evaluation Problem)-----前向后向的概率计算:给定一个观测序列和模型参数,计算观测序列出现的概率。也就是说,我们需要计算给定观测序列 O 的条件下,模型参数 θ=(A, B, π) 下的 P(O|θ)。
- 解码问题(Decoding Problem)-----维特比算法求解:给定一个观测序列和模型参数,找到最可能的隐藏状态序列。也就是说,我们需要找到使得 P(Q|O, θ) 最大的隐藏状态序列 Q,其中 Q 表示隐藏状态序列,O 表示观测序列,θ 表示模型参数。
- 学习问题(Learning Problem)-----鲍姆-韦尔奇算法求解:给定一个观测序列,通过对观测序列的观察来估计模型的参数。也就是说,我们需要估计模型参数 θ=(A, B, π) 的值,使得在给定观测序列 O 下的 P(O|θ) 达到最大。
这三类问题在HMM中都具有重要的意义,评估问题用于计算观测序列的概率,解码问题用于推断最可能的隐藏状态序列,学习问题用于估计模型参数。解决这些问题的方法包括维特比算法、前向-后向算法、Baum-Welch算法等。
三、前向后向算法评估观察序列概率
1.前向算法的基本流程
前向算法本质上属于动态规划的算法,也就是我们要通过找到局部状态递推的公式,这样一步步地从子问题的最优解拓展到整个问题的最优解。前向算法的时间复杂度为:O(TN2),暴力求解的时间复杂度为:O(TNT)。
前向算法是用于解决隐马尔可夫模型(HMM)中的评估问题,即给定一个观测序列和模型参数,计算观测序列的概率。下面是前向算法的基本流程:
- 初始化:对于时间步骤 t=1,计算初始状态的概率。即计算每个状态 i 的初始概率值,即 π[i] * 观测概率矩阵[i, O[1]],其中 π[i] 是初始状态概率分布,O[1] 是观测序列中的第一个观测值。
- 递推:对于每个时间步骤 t>1,递归地计算每个状态 i 的前向概率。具体步骤如下:
- 对于每个状态 i,在上一个时间步骤 t-1 的每个状态 j 上计算概率值。即计算上一步的前向概率乘以状态转移概率和观测概率,即 α[t-1, j] * 状态转移矩阵[j, i] * 观测概率矩阵[i, O[t]]。
- 将上述计算结果累加得到当前时间步骤 t 的前向概率,即 α[t, i] = Σ(α[t-1, j] * 状态转移矩阵[j, i] * 观测概率矩阵[i, O[t]])。
- 终止:计算观测序列的概率。将最后一个时间步骤的前向概率进行累加,即 P(O) = Σ(α[T, i]),其中 T 是观测序列的长度。
通过前向算法,可以有效计算出给定观测序列的概率。该概率可以用于模型选择、序列比较等应用。
2.前向算法的实例
假设我们有一个隐马尔可夫模型(HMM),包含三个隐藏状态 {A, B, C} 和三个观测值 {1, 2, 3}。给定观测序列 O = [1, 2, 3],我们要计算该观测序列出现的概率。
首先,我们需要定义模型的参数,包括初始状态概率分布 π,状态转移概率矩阵 A,和观测概率矩阵 B。假设参数如下:
初始状态概率分布 π = [0.3, 0.4, 0.3] 状态转移概率矩阵 A = [[0.2, 0.5, 0.3], [0.4, 0.1, 0.5], [0.3, 0.6, 0.1]] 观测概率矩阵 B = [[0.6, 0.4, 0.0], [0.1, 0.7, 0.2], [0.3, 0.3, 0.4]]
接下来,我们可以使用前向算法计算观测序列的概率。
-
初始化:计算初始状态的概率。根据初始状态概率分布 π 和观测序列的第一个观测值 O[1] = 1,我们可以计算每个状态的初始概率值:
- α[1, A] = π[A] * B[A, 1] = 0.3 * 0.6 = 0.18
- α[1, B] = π[B] * B[B, 1] = 0.4 * 0.1 = 0.04
- α[1, C] = π[C] * B[C, 1] = 0.3 * 0.3 = 0.09
-
递推:根据状态转移概率矩阵和观测概率矩阵,递归地计算每个时间步骤的前向概率。对于时间步骤 t>1,我们可以使用以下公式计算前向概率:
- α[t, i] = Σ(α[t-1, j] * A[j, i] * B[i, O[t]])
根据上述公式,我们可以计算出每个时间步骤的前向概率:
- α[2, A] = α[1, A] * A[A, A] * B[A, 2] + α[1, B] * A[B, A] * B[A, 2] + α[1, C] * A[C, A] * B[A, 2] = 0.18 * 0.2 * 0.4 + 0.04 * 0.4 * 0.4 + 0.09 * 0.3 * 0.4 = 0.0468
- α[2, B] = α[1, A] * A[A, B] * B[B, 2] + α[1, B] * A[B, B] * B[B, 2] + α[1, C] * A[C, B] * B[B, 2] = 0.18 * 0.5 * 0.7 + 0.04 * 0.1 * 0.7 + 0.09 * 0.6 * 0.7 = 0.0804
- α[2, C] = α[1, A] * A[A, C] * B[C, 2] + α[1, B] * A[B, C] * B[C, 2] + α[1, C] * A[C, C] * B[C, 2] = 0.18 * 0.3 * 0.0 + 0.04 * 0.5 * 0.0 + 0.09 * 0.1 * 0.0 = 0.0
- α[3, A] = α[2, A] * A[A, A] * B[A, 3] + α[2, B] * A[B, A] * B[A, 3] + α[2, C] * A[C, A] * B[A, 3] = …
- α[3, B] = …
- α[3, C] = …
-
终止:计算观测序列的概率。将最后一个时间步骤的前向概率进行累加,即 P(O) = Σ(α[T, i]),其中 T 是观测序列的长度。
通过以上计算,我们可以得到观测序列 O = [1, 2, 3] 的概率 P(O)。在本例中,通过前向算法计算得到的观测序列的概率为 P(O) = α[3, A] + α[3, B] + α[3, C] = 0.0648 + 0.1044 + 0.0 = 0.1692。
3.后向算法的基本流程
后向算法用于计算给定观测序列的概率。下面是后向算法的流程:
-
初始化:将所有时间步骤的后向概率初始化为1,即 β[T, i] = 1,其中 T 是观测序列的长度。
-
递推:从倒数第二个时间步骤开始,递归地计算每个时间步骤的后向概率。对于时间步骤 t<T,可以使用以下公式计算后向概率:
- β[t, i] = Σ(β[t+1, j] * A[i, j] * B[j, O[t+1]])
根据上述公式,我们可以计算出每个时间步骤的后向概率:
- β[T-1, A] = β[T, A] * A[A, A] * B[A, O[T]] + β[T, B] * A[A, B] * B[B, O[T]] + β[T, C] * A[A, C] * B[C, O[T]] = …
- β[T-1, B] = …
- β[T-1, C] = …
- β[T-2, A] = β[T-1, A] * A[A, A] * B[A, O[T-1]] + β[T-1, B] * A[A, B] * B[B, O[T-1]] + β[T-1, C] * A[A, C] * B[C, O[T-1]] = …
- β[T-2, B] = …
- β[T-2, C] = …
依此类推,递推计算每个时间步骤的后向概率。
-
终止:计算观测序列的概率。将初始状态概率分布与第一个时间步骤的观测概率矩阵相乘,再与第一个时间步骤的后向概率向量相乘,即可得到观测序列的概率:
- P(O) = Σ(π[i] * B[i, O[1]] * β[1, i])
通过以上计算,我们可以得到观测序列 O 的概率 P(O)。
四、维特比算法解码隐藏状态序列
1.维特比算法的基本流程
维特比算法是一个通用的求序列最短路径的动态规划算法,也可用于很多其他问题。
维特比算法用于解码隐藏状态序列,即找到最可能的隐藏状态序列。下面是维特比算法的流程:
-
初始化:将初始时间步骤的最大概率路径的概率初始化为1,即 δ[1, i] = π[i],其中 π 是初始状态概率分布。
-
递推:从第二个时间步骤开始,递归地计算每个时间步骤的最大概率路径的概率和路径。对于时间步骤 t>1,可以使用以下公式计算最大概率路径:
- δ[t, j] = max(δ[t-1, i] * A[i, j] * B[j, O[t]]),其中 i 是前一个时间步骤的隐藏状态,j 是当前时间步骤的隐藏状态。
根据上述公式,我们可以计算出每个时间步骤的最大概率路径的概率和路径:
- δ[2, A] = max(δ[1, A] * A[A, A] * B[A, O[2]], δ[1, B] * A[B, A] * B[A, O[2]], δ[1, C] * A[C, A] * B[A, O[2]]) = …
- δ[2, B] = …
- δ[2, C] = …
- δ[3, A] = max(δ[2, A] * A[A, A] * B[A, O[3]], δ[2, B] * A[B, A] * B[A, O[3]], δ[2, C] * A[C, A] * B[A, O[3]]) = …
- δ[3, B] = …
- δ[3, C] = …
依此类推,递推计算每个时间步骤的最大概率路径的概率和路径。
-
终止:找到最后一个时间步骤的最大概率路径的概率和路径。最终的隐藏状态序列是具有最大概率路径的隐藏状态序列。
通过以上计算,我们可以找到最可能的隐藏状态序列。
2.维特比算法的实例
假设我们有一个隐马尔可夫模型(HMM),其中隐藏状态是晴天(Sunny)和雨天(Rainy),观测状态是散步(Walk)和购物(Shop)。我们的目标是根据观测序列来解码隐藏状态序列。
给定以下参数和观测序列:
隐藏状态转移矩阵 A:
Sunny Rainy
Sunny 0.7 0.3
Rainy 0.4 0.6
观测状态概率矩阵 B:
Walk Shop
Sunny 0.8 0.2
Rainy 0.3 0.7
初始状态概率分布 π:
Sunny 0.6
Rainy 0.4
观测序列 O:Walk, Walk, Shop
现在我们将使用维特比算法来解码隐藏状态序列。
- 初始化:将初始时间步骤的最大概率路径的概率初始化为1,即 δ[1, i] = π[i]。
- 递推:从第二个时间步骤开始,递归地计算每个时间步骤的最大概率路径的概率和路径。
- 对于时间步骤 t=2:
- δ[2, Sunny] = max(δ[1, Sunny] * A[Sunny, Sunny] * B[Sunny, Walk], δ[1, Rainy] * A[Rainy, Sunny] * B[Sunny, Walk]) = 0.6 * 0.7 * 0.8 = 0.336
- δ[2, Rainy] = max(δ[1, Sunny] * A[Sunny, Rainy] * B[Rainy, Walk], δ[1, Rainy] * A[Rainy, Rainy] * B[Rainy, Walk]) = 0.6 * 0.3 * 0.3 = 0.054
- 对于时间步骤 t=3:
- δ[3, Sunny] = max(δ[2, Sunny] * A[Sunny, Sunny] * B[Sunny, Shop], δ[2, Rainy] * A[Rainy, Sunny] * B[Sunny, Shop]) = 0.336 * 0.7 * 0.2 = 0.04704
- δ[3, Rainy] = max(δ[2, Sunny] * A[Sunny, Rainy] * B[Rainy, Shop], δ[2, Rainy] * A[Rainy, Rainy] * B[Rainy, Shop]) = 0.336 * 0.3 * 0.7 = 0.07056
- 对于时间步骤 t=2:
- 终止:找到最后一个时间步骤的最大概率路径的概率和路径。
- 最后一个时间步骤是 t=3:
- 最大概率路径的概率是 max(δ[3, Sunny], δ[3, Rainy]) = max(0.04704, 0.07056) = 0.07056
- 当时间步骤为3时,最大概率路径对应的隐藏状态是 Rainy
- 时间步骤是 t=2:
- 最大概率路径的概率是 max(δ[2, Sunny], δ[2, Rainy]) = max(0.336, 0.054)
- 当时间步骤为2时,最大概率路径对应的隐藏状态是 Sunny
- 时间步骤是 t=1:
- 最大概率路径的概率是 max(δ[1, Sunny], δ[1, Rainy] = max(0.6, 0.4)
- 当时间步骤为1时。最大概率路径对应的隐藏状态是 Sunny
- 最后一个时间步骤是 t=3:
因此,根据观测序列 Walk, Walk, Shop,使用维特比算法解码得到的最可能的隐藏状态序列是 Sunny, Sunny, Rainy。
五、鲍姆-韦尔奇算法简介
1.鲍姆-韦尔奇算法的基本流程
鲍姆-韦尔奇算法,其实就是基于EM算法的求解,只不过鲍姆-韦尔奇算法出现的时代,EM算法还没有被抽象出来,所以被叫为鲍姆-韦尔奇算法。
鲍姆-韦尔奇算法(Baum-Welch algorithm)是用于无监督学习的隐马尔可夫模型(HMM)参数估计的一种算法。其基本流程如下:
- 初始化:随机初始化隐藏状态转移矩阵 A、观测状态概率矩阵 B、初始状态概率分布 π,或者使用先验知识进行初始化。
- E步骤(Expectation step):
- 使用前向算法计算在当前参数下观测序列的前向概率 α 和后向概率 β。
- 使用 α 和 β 计算在每个时间步骤 t 和隐藏状态 i 下,隐藏状态为 i 的概率作为后验概率 γ。
- M步骤(Maximization step):
- 使用观测序列和后验概率 γ 更新隐藏状态转移矩阵 A、观测状态概率矩阵 B、初始状态概率分布 π。
- 计算在当前参数下观测序列的似然函数,并检查是否达到收敛条件。如果未达到收敛条件,则返回第2步。
- 重复第2步和第3步,直到达到收敛条件(例如,参数变化小于给定阈值)或达到最大迭代次数。
最终,鲍姆-韦尔奇算法通过迭代优化参数,使得隐马尔可夫模型的参数逼近最优值,从而更好地描述观测数据的生成过程。
六、HMM模型API介绍
1.API的安装
pip3 install hmmlearn
2.hmmlearn介绍
hmmlearn实现了三种HMM模型类,按照观测状态是连续状态还是离散状态,可分为两类。
GaussianHMM 和 GMMHMM 是连续观测状态的 HMM 模型,而 MultinomialHMM 和 CategoricalHMM 是离散观测状态的模型,也是我们在HMM原理系列篇里使用的模型。文章来源:https://www.toymoban.com/news/detail-474203.html
对于 CategoricalHMM 的模型,使用比较简单,文章来源地址https://www.toymoban.com/news/detail-474203.html
- “startprob_”:对应我们的隐藏状态初始分布 π。
- “transmat_”:对应状态转移矩阵A。
- “emissionprob_”:对应观测状态概率矩阵B。
- “n_features”:观测序列的种类
3.CategoricalHMM 代码实例
import numpy as np
from hmmlearn import hmm
# 设定隐藏状态的集合
states = ["box1", "box2", "box3"]
n_states = len(states)
# 设定观测状态的集合
observations = ["red", "white"]
n_observations = len(observations)
# 设定初始状态概率分布 π
start_probability = np.array([0.2, 0.4, 0.4])
# 设定隐藏状态转移矩阵 A
transition_probability = np.array([
[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]])
# 设定观测状态概率矩阵 B
emission_probability = np.array([
[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]])
# 设定参数模型
model = hmm.CategoricalHMM(n_components=n_states)
# 设定初始状态概率分布
model.startprob_ = start_probability
# 设定隐藏状态转移矩阵A
model.transmat_ = transition_probability
# 设定观测状态概率矩阵B
model.emissionprob_ = emission_probability
# 设定观测序列的种类
model.n_features = n_observations
# 设定观测序列,根据维特比算法解码隐藏状态序列
seen = np.array([[0, 1, 0, 1, 1]]).T
# 将观测序列转化成 red white 形式
tran_seen = [observations[x] for x in seen.flatten()]
tran_seen = ",".join(tran_seen)
print("球的观测序列为:\n",tran_seen)
# 维特比模型训练,解码隐藏状态序列
box = model.predict(seen)
tran_box = ",".join([states[x] for x in box])
print("盒子最可能的隐藏状态序列为:\n",tran_box)
到了这里,关于EM算法和HMM模型的介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!