隐马尔可夫模型(HMM) python实现

C S D N 真 的 很 过 分 , 换 了 K a t e x 很 多 公 式 都 显 示 不 出 来 了 … … 看 完 整 公 式 请 移 步 \color{red}{CSDN真的很过分,换了Katex很多公式都显示不出来了……看完整公式请移步} CSDNKatex
Baileyswu@github

学习目标:

  • 介绍HMM的定义与符号
  • 讨论HMM的三个基本问题
    • 概率计算问题:前后向算法
    • 学习问题:Baum-Welch模型,EM算法计算参数
    • 预测问题:Viterbi算法
  • 每种算法用代码实现
  • 参考李航的《统计学习方法》(在这里吐槽一下HMM那章下标 i i i 乱用,有些算法不是很ok)

基本概念

HMM是一种时序数据模型。
设序列长度为 T T T ,具有观测序列 X ⃗ = { x ⃗ 1 , … , x ⃗ T } \vec X=\{\vec x_1,\dots,\vec x_T\} X ={ x 1,,x T}隐变量序列 Z ⃗ = { z ⃗ 1 , … , z ⃗ T } \vec Z=\{\vec z_1,\dots,\vec z_T\} Z ={ z 1,,z T}
这里认为每一个观测都由对应的隐变量生成。隐变量序列是Markov链, z ⃗ t \vec z_t z t只依赖于 z ⃗ t − 1 \vec z_{t-1} z t1

变量都在有限的状态集里变化,观测的状态集 S ⃗ = { s ⃗ 1 , … , s ⃗ M } \vec S=\{\vec s_1,\dots,\vec s_M\} S ={ s 1,,s M}隐变量的状态集 H ⃗ = { h ⃗ 1 , … , h ⃗ N } \vec H=\{\vec h_1,\dots,\vec h_N\} H ={ h 1,,h N}
因此 x ⃗ t ∈ S ⃗ , z ⃗ t ∈ H ⃗ , t = 1 , … , T \vec x_t\in \vec S,\vec z_t\in \vec H,t=1,\dots,T x tS ,z tH ,t=1,,T
有时需要反向找到某状态是状态集里的第几个,定义 f i n d i n d e x ( z ⃗ t ) = i findindex(\vec z_t)=i findindex(z t)=i ,表示 z ⃗ t = h ⃗ i \vec z_t = \vec h_i z t=h i
同理也有 f i n d i n d e x ( x ⃗ t ) = i findindex(\vec x_t)=i findindex(x t)=i ,表示 x ⃗ t = s ⃗ i \vec x_t = \vec s_i x t=s i

隐状态间的转移矩阵 A ⃗ = [ a i j ] N × N \vec A=[a_{ij}]_{N\times N} A =[aij]N×N a i j a_{ij} aij 是从状态 h ⃗ i \vec h_i h i 转移到 h ⃗ j \vec h_j h j 的概率。
从隐状态到观测的发射矩阵 B ⃗ = [ b i j ] N × M \vec B=[b_{ij}]_{N\times M} B =[bij]N×M b i j b_{ij} bij 是从状态 h ⃗ i \vec h_i h i 转移到观测 s ⃗ j \vec s_j s

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
隐马尔可夫模型 (HMM, Hidden Markov Model) 是一种概率模型,用于描述一个系统的隐藏状态在某个时刻的概率分布,以及这个系统从一个状态转移到另一个状态的概率。这些信息都是通过观测到的系统行为来推断出来的。 下面是一个使用 Python 实现 HMM 的示例代码: ```python import numpy as np class HMM: def __init__(self, n, m): self.n = n # number of hidden states self.m = m # number of observable symbols self.A = np.zeros((n, n)) # transition probability matrix self.B = np.zeros((n, m)) # emission probability matrix self.pi = np.zeros(n) # initial state probability distribution def fit(self, X, Y, T): """ Fit the HMM model to the given data using the Baum-Welch algorithm. X: list of sequences of observable symbols Y: list of sequences of hidden states T: list of lengths of the sequences """ # Initialize the model parameters using the given data self.n = len(set(Y)) self.m = len(set(X)) self.A = np.zeros((self.n, self.n)) self.B = np.zeros((self.n, self.m)) self.pi = np.zeros(self.n) for x, y, t in zip(X, Y, T): self.pi[y[0]] += 1 for i in range(t-1): self.A[y[i]][y[i+1]] += 1 self.B[y[i]][x[i]] += 1 self.pi /= sum(self.pi) self.A /= np.sum(self.A, axis=1).reshape(-1, 1) self.B /= np.sum(self.B, axis=1).reshape(-1, 1) # Use the Baum-Welch algorithm to estimate the model parameters while True: # Expectation step alpha = self._forward(X, T) beta = self._backward(X, T) xi = self._compute_xi(X, T, alpha, beta) gamma = self._compute_gamma(alpha, beta) # Maximization step new_A = np.sum(xi, axis=0) / np.sum(gamma[
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值