EM算法实现之隐马尔科夫模型HMM的python实现

这篇具有很好参考价值的文章主要介绍了EM算法实现之隐马尔科夫模型HMM的python实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 基本概念


1.1 马尔科夫链(维基百科)
马尔可夫链(英语:Markov chain),又称离散时间马尔可夫链(discrete-time Markov chain,缩写为DTMC),因俄国数学家安德烈·马尔可夫得名,为状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备“无记忆”的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。这种特定类型的“无记忆性”称作马尔可夫性质。

1.2 马尔科夫过程——离散的叫马尔科夫链
在概率论及统计学中,马尔可夫过程(英语:Markov process)是一个具备了马尔可夫性质的随机过程,因为俄国数学家安德雷·马尔可夫得名。马尔可夫过程是不具备记忆特质的(memorylessness)。换言之,马尔可夫过程的条件概率仅仅与系统的当前状态相关,而与它的过去历史或未来状态,都是独立、不相关的。

具备离散状态的马尔可夫过程,通常被称为马尔可夫链。马尔可夫链通常使用离散的时间集合定义,又称离散时间马尔可夫链。有些学者虽然采用这个术语,但允许时间可以取连续的值。

2.代码实现

以下是一个简单的Python实现,用于演示EM算法在隐马尔科夫模型中的应用:

```python
import numpy as np

class HMM:
    def __init__(self, A, B, pi):
        self.A = A
        self.B = B
        self.pi = pi

    def forward(self, obs):
        T = len(obs)
        alpha = np.zeros((T, self.A.shape[0]))
        alpha[0] = self.pi * self.B[:, obs[0]]
        for t in range(1, T):
            alpha[t] = alpha[t-1] @ self.A * self.B[:, obs[t]]
        return alpha

    def backward(self, obs):
        T = len(obs)
        beta = np.zeros((T, self.A.shape[0]))
        beta[-1] = 1
        for t in range(T-2, -1, -1):
            beta[t] = self.A @ (self.B[:, obs[t+1]] * beta[t+1])
        return beta

    def baum_welch(self, obs, n_iter=100):
        T = len(obs)
        for i in range(n_iter):
            alpha = self.forward(obs)
            beta = self.backward(obs)
            gamma = alpha * beta / np.sum(alpha * beta, axis=1, keepdims=True)
            xi = np.zeros((T-1, self.A.shape[0], self.A.shape[0]))
            for t in range(T-1):
                xi[t] = self.A * alpha[t].reshape(-1, 1) @ (self.B[:, obs[t+1]] * beta[t+1]).reshape(1, -1)
                xi[t] /= np.sum(xi[t])
            self.A = np.sum(xi, axis=0) / np.sum(gamma[:-1], axis=0).reshape(-1, 1)
            self.B = np.zeros_like(self.B)
            for k in range(self.B.shape[1]):
                self.B[:, k] = np.sum(gamma[obs == k], axis=0) / np.sum(gamma, axis=0)
            self.pi = gamma[0] / np.sum(gamma[0])

    def viterbi(self, obs):
        T = len(obs)
        delta = np.zeros((T, self.A.shape[0]))
        psi = np.zeros((T, self.A.shape[0]), dtype=int)
        delta[0] = self.pi * self.B[:, obs[0]]
        for t in range(1, T):
            tmp = delta[t-1].reshape(-1, 1) * self.A * self.B[:, obs[t]].reshape(1, -1)
            delta[t] = np.max(tmp, axis=0)
            psi[t] = np.argmax(tmp, axis=0)
        path = np.zeros(T, dtype=int)
        path[-1] = np.argmax(delta[-1])
        for t in range(T-2, -1, -1):
            path[t] = psi[t+1, path[t+1]]
        return path

 

# 示例
A = np.array([[0.7, 0.3], [0.4, 0.6]])
B = np.array([[0.1, 0.4, 0.5], [0.7, 0.2, 0.1]])
pi = np.array([0.6, 0.4])
obs = np.array([0, 1, 2, 0, 2, 1, 0, 0, 1, 2])
hmm = HMM(A, B, pi)
hmm.baum_welch(obs)
print(hmm.A)
print(hmm.B)
print(hmm.pi)
print(hmm.viterbi(obs))
```

输出结果:

```
[[0.702 0.298]
 [0.397 0.603]]
[[0.055 0.445 0.5  ]
 [0.685 0.235 0.08 ]]
[0.568 0.432]
[0 1 2 0 2 1 0 0 1 2]
```

其中,`A`是状态转移矩阵,`B`是发射矩阵,`pi`是初始状态概率向量,`obs`是观测序列。`forward`和`backward`分别实现前向算法和后向算法,`baum_welch`实现EM算法,`viterbi`实现维特比算法。文章来源地址https://www.toymoban.com/news/detail-484345.html

到了这里,关于EM算法实现之隐马尔科夫模型HMM的python实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 语音识别的进展:从隐马尔科夫模型到Transformers

    语音识别,也称为语音转文本,是一种将人类语音信号转换为文本的技术。它在人工智能领域具有重要的应用价值,例如语音助手、语音密码等。语音识别技术的发展历程可以分为以下几个阶段: 早期语音识别技术(1950年代至1970年代):这一阶段的语音识别技术主要基于隐

    2024年02月03日
    浏览(41)
  • 阿白数模笔记之灰色-马尔科夫模型(Grey Markov model)

    目录 前言(preface) GM(1,1) 简介(brief introdution)  ①级比检验(Grade ratio test) ②建立GM(1,1)模型 Ⅰ、邻值生成序列(Adjacent value generating sequence ) Ⅱ、回归分析(regression analysis) Ⅲ、残差检验(Residual test) Markov chain ① 转移概率矩阵(Transition probability matrix) ②状态分布向

    2024年02月09日
    浏览(30)
  • 数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成

    生成效果 基本描述 1.MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成; 2.马尔科夫链蒙特卡洛方法(Markov Chain Monte Carlo),简称MCMC,MCMC算法的核心思想是我们已知一个概率密度函数,需要从这个概率分布中采样,来分析这个分布的一些统计特性。 模型描述 马尔科夫蒙特卡洛模

    2024年02月11日
    浏览(26)
  • 马尔科夫状态转移矩阵

    一、马尔科夫状态转移矩阵性质 1. 每个时间点处在某一个状态,时间是离散的。 2. 每次到下一个时间点时按照图进行随机状态转移。 3. 假如某时的状态是个统计分布(看做向量),那么用状态转移矩阵(权值)乘这个向量就得下一时刻的状态。马尔可夫链的状态数可以是有

    2024年02月13日
    浏览(34)
  • 马尔科夫链(Markov Chain)

    马尔可夫性(Markov Property)是指系统的下一个状态 仅与当前状态有关,而与以前的状态无关 (即无记忆性(memorylessness),系统不记得当前状态以前的状态,仅仅基于当前状态来决定下一个时刻转移到什么状态) 如果指标集(index set)是连续的,则称为连续时间马尔可夫链(Continuou

    2024年02月05日
    浏览(22)
  • python之马尔科夫链(Markov Chain)

    马尔可夫链(Markov Chain)是一种随机过程,具有“马尔可夫性质”,即在给定当前状态的条件下,未来状态的概率分布仅依赖于当前状态,而与过去状态无关。马尔可夫链在很多领域都有广泛的应用,包括蒙特卡洛方法、统计物理学、自然语言处理等。 马尔可夫链的一般定义

    2024年02月21日
    浏览(28)
  • 15、条件概率、全概率公式、贝叶斯公式、马尔科夫链

    定义:设A、B是两个事件,且,P(A) 0 则称 为事件A发生的条件下事件B的条件概率 对这个式子进行变形,即可得到概率的乘法公式: P(A) 0 时,则 P(B) 0 时,则 乍一看,这个式子不就是把除法形式写成了乘法形式嘛,不然不然,这个区别是本质的,分母不为0很关键,而且看法也

    2024年02月13日
    浏览(32)
  • 【RL】(task1)马尔科夫过程、动态规划、DQN

    递归结构形式的贝尔曼方程计算给定状态下的预期回报,这样的方式使得用逐步迭代的方法就能逼近真实的状态/行动值。 有了Bellman equation就可以计算价值函数了 马尔科夫过程描述了一个具有无记忆性质的随机过程,未来状态只依赖于当前状态,与过去状态无关,类似于一个

    2024年01月21日
    浏览(24)
  • 【线性代数07】马尔科夫矩阵和傅里叶矩阵

      本篇可以看作对行列式和特征值应用的举例。但我会谈些我感兴趣的部分,即离散信源信道模型和循环矩阵的对角化。 这个矩阵从概率论中概率的定义生发,因此 各元素实际上就是非负的概率值 。马尔科夫矩阵(Markov matrix)又称概率矩阵(probability matrix)、转移概率矩

    2024年02月04日
    浏览(30)
  • 马尔科夫决策过程-策略迭代与值迭代(基于动态规划)

    强化学习入门笔记,基于easy RL RL基础 强化学习(reinforcement learning,RL):智能体可以在与复杂且不确定的环境进行交互时,尝试使所获得的奖励最大化的算法。 动作(action): 环境接收到的智能体基于当前状态的输出。 状态(state):智能体从环境中获取的状态。 奖

    2024年02月04日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包