首页 > 编程语言 >隐马尔可夫模型之Baum-Welch算法详解

隐马尔可夫模型之Baum-Welch算法详解

时间:2023-09-28 18:01:41浏览次数:41  
标签:Baum self 算法 states np 马尔可夫 observations 0.25 Welch


隐马尔可夫模型之Baum-Welch算法详解

前言

在上篇博文中,我们学习了隐马尔可夫模型的概率计算问题和预测问题,但正当要准备理解学习问题时,发现学习问题中需要EM算法的相关知识,因此,上一周转而学习了EM算法和极大似然估计,对隐藏变量的求解有了一些自己的理解,现在我们继续回过头来学习隐马尔可夫模型的学习问题。EM算法的相关介绍可参照博文 EM算法及其推广学习笔记。如果对隐马尔可夫模型还不胜了解的话,可参看博文隐马尔可夫学习笔记(一)。

学习问题

隐马尔可夫模型的学习,根据训练数据是包括观测序列和对应的状态序列还是只有观测序列,可以分别由监督学习与非监督学习实现。本节首先介绍监督学习算法,而后介绍非监督学习算法——Baum-Welch算法(也就是EM算法)。

监督学习问题

假设已给训练数据包含S个长度相同的观测序列和对应的状态序列{(O1,I1),(O2,I2),...,(OS,IS)},那么可以利用极大似然估计方法来估计隐马尔可夫模型的参数,具体方法如下。

隐马尔可夫模型之Baum-Welch算法详解_前向算法

隐马尔可夫模型之Baum-Welch算法详解_监督学习_02

隐马尔可夫模型之Baum-Welch算法详解_数据_03

隐马尔可夫模型之Baum-Welch算法详解_数据_04

隐马尔可夫模型之Baum-Welch算法详解_前向算法_05

隐马尔可夫模型之Baum-Welch算法详解_监督学习_06

隐马尔可夫模型之Baum-Welch算法详解_数据_07

隐马尔可夫模型之Baum-Welch算法详解_监督学习_08

隐马尔可夫模型之Baum-Welch算法详解_前向算法_09

隐马尔可夫模型之Baum-Welch算法详解_数据_10

理论分析总算完毕了,简单总结一下前向后向算法,首先隐马尔可夫模型参数的估计问题是一个隐藏变量的极大似然估计,因此我们用到了EM算法来解决上述参数估计问题,从EM算法中,求得Q函数,从而能够对Q函数进行求偏导,得到极大似然函数的极值,求偏导算出了参数估计的公式,与先前λ^参数产生了关系,并进一步需要计算大量联合概率,而联合概率的计算巧妙的使用了节点图的各种性质,用中间变量降低了节点计算的复杂度,导出了对计算有帮助的定义,方便参数求解。

Code Time

Baum-Welch算法的Python实现

接着前文hmm.py和test.py文件继续添加。

1.在hmm.py中添加baum_welch_train算法

def baum_welch_train(self, observations, criterion=0.05):
    n_states = self.A.shape[0]
    # 观察序列的长度T
    n_samples = len(observations)

    done = False
    while not done:
        # alpha_t(i) = P(o_1,o_2,...,o_t,q_t = s_i | hmm)
        # Initialize alpha
        # 获得所有前向传播节点值 alpha_t(i)
        alpha = self._forward(observations)

        # beta_t(i) = P(o_t+1,o_t+2,...,o_T | q_t = s_i , hmm)
        # Initialize beta
        # 获得所有后向传播节点值 beta_t(i)
        beta = self._backward(observations)

        # 计算 xi_t(i,j) -> xi(i,j,t)
        xi = np.zeros((n_states, n_states, n_samples - 1))
        # 在每个时刻
        for t in range(n_samples - 1):
            # 计算P(O | hmm)
            denom = sum(alpha[:, -1])
            for i in range(n_states):
                # numer[1,:] = 行向量,alpha[i,t]=实数,slef.A[i,:] = 行向量
                # self.B[:,observations[t+1]].T = 行向量,beta[:,t+1].T = 行向量
                numer = alpha[i, t] * self.A[i, :] * self.B[:, observations[t + 1]].T * beta[:, t + 1].T
                xi[i, :, t] = numer / denom

            # 计算gamma_t(i) 就是对j进行求和
            gamma = np.sum(xi, axis=1)
            # need final gamma elements for new B
            prod = (alpha[:, n_samples - 1] * beta[:, n_samples - 1]).reshape((-1, 1))
            # 合并T时刻的节点
            gamma = np.hstack((gamma, prod / np.sum(prod)))
            # 列向量
            newpi = gamma[:, 0]
            newA = np.sum(xi, 2) / np.sum(gamma[:, :-1], axis=1).reshape((-1, 1))
            newB = np.copy(self.B)

            # 观测状态数
            num_levels = self.B.shape[1]
            sumgamma = np.sum(gamma, axis=1)
            for lev in range(num_levels):
                mask = observations == lev
                newB[:, lev] = np.sum(gamma[:, mask], axis=1) / sumgamma

            if np.max(abs(self.pi - newpi)) < criterion and \
                            np.max(abs(self.A - newA)) < criterion and \
                            np.max(abs(self.B - newB)) < criterion:
                done = 1
            self.A[:], self.B[:], self.pi[:] = newA, newB, newpi

2.在hmm.py中添加模拟序列生成函数

def simulate(self, T):
    def draw_from(probs):
        # np.random.multinomial 为多项式分布,1为实验次数,类似于投掷一枚骰子,丢出去是几,probs每个点数的概率,均为1/6
        # 给定行向量的概率,投掷次数为1次,寻找投掷的点数
        return np.where(np.random.multinomial(1, probs) == 1)[0][0]

    observations = np.zeros(T, dtype=int)
    states = np.zeros(T, dtype=int)
    states[0] = draw_from(self.pi)
    observations[0] = draw_from(self.B[states[0], :])
    for t in range(1, T):
        states[t] = draw_from(self.A[states[t - 1], :])
        observations[t] = draw_from(self.B[states[t], :])
    return observations, states

回到海藻模型,我们可以用这样一串代码完成Baum-Welch算法的训练,并且评估其准确率。

3.在test.py中添加测试代码

# 参数估计
observations_data, states_data = h.simulate(100)
guess = hmm.HMM(array([[0.33, 0.33, 0.34],
                       [0.33, 0.33, 0.34],
                       [0.33, 0.33, 0.34]]),
                array([[0.25, 0.25, 0.25, 0.25],
                       [0.25, 0.25, 0.25, 0.25],
                       [0.25, 0.25, 0.25, 0.25]]),
                array([0.7, 0.15, 0.15])
                )
guess.baum_welch_train(observations_data)
# 预测问题
states_out = guess.state_path(observations_data)[1]
p = 0.0
for s in states_data:
    if next(states_out) == s: p += 1

print(p / len(states_data))

经过多次测试,本算法的预测准确率在0.3~0.5。可见隐马尔可夫模型的参数估计的准确率还没有到令人满意的程度。

参考文献

  1. EM算法及其推广学习笔记
  2. 隐马尔可夫学习笔记(一)
  3. 李航. 统计学习方法[M]. 北京:清华大学出版社,2012



标签:Baum,self,算法,states,np,马尔可夫,observations,0.25,Welch
From: https://blog.51cto.com/u_16184402/7641417

相关文章

  • R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证
    全文链接:http://tecdat.cn/?p=31162最近我们被客户要求撰写关于SV模型的研究报告,包括一些图形和统计输出。本文做SV模型,选取马尔可夫蒙特卡罗法(MCMC)、正则化广义矩估计法和准最大似然估计法估计。模拟SV模型的估计方法:  sim<-svsim(1000,mu=-9,phi=0.97,sigma......
  • matlab用马尔可夫链蒙特卡罗 (MCMC) 的Logistic逻辑回归模型分析汽车实验数据|附代码
    原文链接:http://tecdat.cn/?p=24103此示例说明如何使用逻辑回归模型进行贝叶斯推断 ( 点击文末“阅读原文”获取完整代码数据 )。统计推断通常基于最大似然估计(MLE)。MLE选择能够使数据似然最大化的参数,是一种较为自然的方法。在MLE中,假定参数是未知但固定的数值,并在一定......
  • 马尔可夫转换模型研究交通伤亡人数事故时间序列预测|附代码数据
    原文链接:http://tecdat.cn/?p=12227最近我们被客户要求撰写关于马尔可夫转换模型的研究报告,包括一些图形和统计输出。本文描述了R语言中马尔克夫转换模型的分析过程首先,对模拟数据集进行详细建模。接下来,将马尔可夫转换模型拟合到具有离散响应变量的真实数据集。用于验证对这些......
  • 拓端tecdat|R语言代写使用马尔可夫链Markov Chain, MC来模拟抵押违约
    这篇文章的目的是将我在夜班学习的材料与我的日常工作和R相结合。如果我们有一些根据固定概率随时间在状态之间切换的对象,我们可以使用马尔可夫链 * 来模拟该对象的长期行为。一个很好的例子是抵押贷款。在任何给定的时间点,贷款都有违约概率,保持最新付款或全额偿还。总的来说,我们......
  • R语言隐马尔可夫模型(HMM)识别不断变化的股市状况股票指数预测实战|附代码数据
    全文下载链接: http://tecdat.cn/?p=1557最近我们被客户要求撰写关于隐马尔可夫模型(HMM)的研究报告,包括一些图形和统计输出。“了解不同的股市状况,改变交易策略,对股市收益有很大的影响。弄清楚何时开始或何时止损,调整风险和资金管理技巧,都取决于股市的当前状况 ( 点击文末“阅......
  • Matlab马尔可夫区制转换动态回归模型估计GDP增长率|附代码数据
    原文链接:http://tecdat.cn/?p=19918最近我们被客户要求撰写关于马尔可夫区制转换动态回归的研究报告,包括一些图形和统计输出。本文估计实际GDP增长率的两状态Markov区制转换动态回归模型  ( 点击文末“阅读原文”获取完整代码数据******** )。创建模型进行估计通过指定转移......
  • 马尔可夫算法
    马氏模型的含义马尔科夫链观察式子当P{En=i,En-1=in-1,...,}=p{En=i},n-1之前发生的事都和现在无关例子:转移概率矩阵练习:第3条说的是不管初始状态是什么只要j趋于无穷,最后极限与初始状态无关,极限趋于一个定值正则矩阵:1、方阵,2、逆矩阵存在例题:这道......
  • 隐马尔可夫学习笔记(一)
    隐马尔可夫模型学习笔记前言学习隐马尔可夫模型时,最大的困难便是一堆公式与实际问题对应不上号。原因可能还是在于对概率论的理解太表面,且隐马尔可夫模型考虑了时间因素,显然这样的随机过程一时半会是难以形象的理解的。因此,本文采用先举例,后定义公式的方式来学习隐马尔可夫模型。思......
  • R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证
    全文链接:http://tecdat.cn/?p=31162最近我们被客户要求撰写关于SV模型的研究报告,包括一些图形和统计输出本文做SV模型,选取马尔可夫蒙特卡罗法(MCMC)、正则化广义矩估计法和准最大似然估计法估计。模拟SV模型的估计方法: sim<-svsim(1000,mu=-9,phi=0.97,sigma=0.15)......
  • Markov Transition Field,马尔可夫转移场(matlab版)
    MarkovTransitionField,马尔可夫转移场(matlab版)将一维时间序列转成二维数据可以对原数据进行更好地表征,从而基于新的表征结合深度学习机器视觉技术来发掘更多的规律和信息。这使得MarkovTransitionField,马尔可夫转移场在金融,能源电力,水利,气象、机械设备,交通等领域时间序列分析......