首页 > 其他分享 >隐马尔科夫模型的简单实现

隐马尔科夫模型的简单实现

时间:2022-09-18 21:47:25浏览次数:80  
标签:res series self 马尔科夫 prob 简单 np 模型 dp

模型 HMM=(A, B, \pi)

初始化三个参数:隐状态初始状态概率向量\pi,状态转移概率矩阵A,隐状态生成观测状态概率矩阵B。

实现三个方法:

1、2. 计算给定观测状态序列向量的概率(前向和后向两种计算方法),

3. 给定观测状态序列,求出与该序列最匹配的隐状态序列及其概率(Viterbi算法)。

程序如下:

# -*- coding: utf-8 -*-
# @Author : ZhaoKe
# @Time : 2022-09-18 14:43
from typing import List

import numpy as np

class HMM():
    def __init__(self):
        # 对应三个隐状态初始化概率矩阵
        self.init_prob = np.array([0.4, 0.3, 0.3])

        # 隐状态会生成观测状态的概率矩阵
        self.gene_prob = np.array([
            [0.8, 0.2],
            [0.6, 0.4],
            [0.3, 0.7]
        ])

        # 状态转移概率矩阵
        self.tran_prob = np.array([
            [0.4, 0.5, 0.1],
            [0.3, 0.4, 0.3],
            [0.1, 0.5, 0.4]
        ])

    # 求解生成特定的序列的概率
    # 例如,输入[0, 1, 0]
    def forward_prob_generate(self, series: List):
        # 行数等于隐状态个数,列数等于序列长度
        # print(len(self.init_prob), len(series))
        res = np.zeros((len(self.init_prob), len(series)))
        res[:, 0] = np.multiply(self.init_prob, self.gene_prob[:, series[0]])
        for i in range(1, len(series)):
            res[:, i] = np.multiply(np.matmul(res[:, i-1], self.tran_prob), self.gene_prob[:, series[i]])
        print(res)

    # 后向生成特定序列的概率
    def backward_prob_generate(self, series: List):
        res = np.zeros((len(self.init_prob), len(series)))
        n = len(series)
        res[:, n-1] = 1
        for i in range(n-2, -1, -1):
            res[:, i] = np.matmul(self.tran_prob, np.multiply(self.gene_prob[:, series[i+1]], res[:, i+1]))
        print(res)
        print(np.sum(self.init_prob * self.gene_prob[:, 1] * res[:, 0]))

    # 维特比算法求解特定观测序列的最优隐状态向量及其概率
    def viterbi(self, series: List):
        # 动态规划
        dp = np.zeros((3, 4))
        dp[:, 0] = 1
        dp[:, 1] = self.init_prob * self.gene_prob[:, series[0]]
        per = list(map(int, np.zeros(len(series)+1)))
        per[1] = np.argmax(dp[:, 1])
        # print(dp)
        # print(per)
        for i in range(2, len(series)+1):
            for j in range(0, 3):
                tmp = dp[:, i-1] * self.tran_prob[:, j]
                dp[j, i] = np.max(tmp) * self.gene_prob[j][series[i-1]]
            print(dp[:, i])
            per[i] = np.argmax(dp[:, i])
        print("动态规划矩阵:\n", dp)
        print("最优路径:", per)
        print("概率计算:", dp[per[-1], 3])


if __name__ == '__main__':
    hmm = HMM()
    # hmm.forward_prob_generate([0, 1, 0])
    # hmm.backward_prob_generate([1, 0, 1])
    # hmm.viterbi([0,0,0])
    # hmm.viterbi([0,0,1])
    # hmm.viterbi([0,1,0])
    # hmm.viterbi([0,1,1])
    hmm.viterbi([1,0,0])
    # hmm.viterbi([1,0,1])
    # hmm.viterbi([1,1,0])
    # hmm.viterbi([1,1,1])

和例题对照,结果正确

 

标签:res,series,self,马尔科夫,prob,简单,np,模型,dp
From: https://www.cnblogs.com/zhaoke271828/p/16705886.html

相关文章

  • 实验一 简单扑朔
         ......
  • 简单纪要:docker入门(一),docker安装!
    一docker是什么、为什么出现了docker?Docker是基于GO开发的云开源项目,是一个用于开发,交付和运行应用程序的开放平台。Docker能使应用程序与基础架构分离,从而实现快速交付......
  • css简单动画 @-webkit-keyframes、-webkit-transform、webkit-animation的使用
    浏览器前缀IE10和Firefox(>=16)支持没有前缀的animation,firefox(<16)使用-moz-前缀,因为现在firefox的版本也都不低,所以firefox都直接使用没有前缀的animation。而chrome,safa......
  • “Affinity Publisher”让排版更简单,轻松完成你的设计大作
    《AffinityPublisher》(以下简称《Publisher》)为桌面出版工作带来了一股简洁的新风。无论你要制作公司简报、社区垃圾分类宣传册,还是要把你自己创作的史诗巨著制成上千页的......
  • (王树森老师课程)【强推】RNN模型和NLP应用
    目录一、数据处理如何将计算机不认识的转化为数字处理文本数据二、文本处理与词嵌入文本转化为序列分词构建字典One-Hot编码序列对齐三、SimpleRNN为什么要使用RNN(Recurren......
  • Js新手-简单数据类型和复杂数据类型
    <!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"cont......
  • 力扣206(java&python)-反转链表(简单)
    题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=......
  • java-简单零钱通项目
    1.项目界面:2.需求分析:(1)完成收益入账;(2)消费;(3)查看明细;(4)退出系统;3.过程分析:a.显示出零钱通菜单:点击查看代码System.out.println("\n=====零钱通菜......
  • 四边形不等式证明简单推导
    前提条件对于\(a\leb\lec\led\),有\(f[a][c]+f[b][d]\lef[a][d]+f[b][c]\),证明内容对于\(l,r,opt\in(l,r)\),若已知:\(\forallopt'\neqopt,opt'\in(l,r),f[l][opt]+......
  • Git (简单基本操作)
    1、设置配置信息查看配置信息:gitconfig-l设置用户名:gitconfig--globaluser.namexxx设置邮箱:gitconfig--globaluser.emailxxx@zbitedu.cn2、查看状态查看状......