首页 > 其他分享 >隐马尔可夫模型之概率计算问题

隐马尔可夫模型之概率计算问题

时间:2024-07-18 16:56:29浏览次数:7  
标签:概率 self probs 观测 马尔可夫 num observations 模型

前向算法

        算法目标:计算给定隐马尔可夫模型\lambda= \left ( \pi ,A,B \right )和观测序列O=\left ( o_{1},o_{2},...,o_{T} \right )的概率 P(O|\lambda )

        算法步骤:通过递归计算前向概率\alpha _{t}\left ( i \right )来实现,其中\alpha _{t}\left ( i \right )表示在时刻t状态为s_{i}并且观测到部分序列o_{1},o_{2},...,o_{t}的概率。

  1. 初始化
    在初始时刻t=1计算所有状态的初始前向概率:\alpha _{1}\left ( i \right )=\pi _{i}b_{i}\left ( o_{1} \right )1\leq i\leq N
    其中,\pi _{i}是初始状态概率,b_{i}\left ( o_{1} \right )是状态s_{i}生成观测o_{1}的概率。
  2. 递归计算
    对于t=2,3,...,T和所有状态s_{j},递归地计算前向概率:\alpha _{t}\left ( j \right )=\left [ \sum_{i=1}^{N} \alpha _{t-1}(i)a_{ij}b_{j}(o_{t})\right ]1\leq j\leq N
    其中,a_{ij}是从状态s_{i}转移到状态s_{j}的概率,b_{j}(o_{t})是状态s_{j}生成观测o_{t}的概率
  3. 终止
    在时刻T结束时,观测序列出现的概率为所有状态的前向概率之和:P(O|\lambda )=\sum_{i=1}^{N}\alpha _{T}(i)

球盒模型

import numpy as np


class HiddenMarkovModel:
    def __init__(self, num_states, num_observations, initial_probs=None, transition_probs=None, emission_probs=None):
        """
        初始化隐马尔可夫模型 (HMM) 参数。

        :param num_states: 状态数量
        :param num_observations: 观测值数量
        :param initial_probs: 初始状态概率向量 (长度为 num_states)
        :param transition_probs: 状态转移概率矩阵 (大小为 num_states x num_states)
        :param emission_probs: 观测概率矩阵 (大小为 num_states x num_observations)
        """
        self.num_states = num_states
        self.num_observations = num_observations
        self.initial_probs = initial_probs
        self.transition_probs = transition_probs
        self.emission_probs = emission_probs

    @staticmethod
    def sample_from_distribution(distribution):
        """
        根据给定的概率分布,从中抽取一个样本。

        :param distribution: 概率分布向量
        :return: 抽取样本的索引
        """
        return np.random.choice(np.arange(len(distribution)), p=distribution)

    def generate_observations(self, sequence_length):
        """
        根据模型参数生成观测序列。

        :param sequence_length: 要生成的观测序列的长度
        :return: 生成的观测序列
        """
        # 从初始状态概率分布中采样初始状态
        current_state = self.sample_from_distribution(self.initial_probs)
        # 从当前状态的观测概率分布中采样观测值
        current_observation = self.sample_from_distribution(self.emission_probs[current_state])
        observations = [current_observation]

        for _ in range(sequence_length - 1):
            # 根据状态转移概率分布采样下一个状态
            next_state = self.sample_from_distribution(self.transition_probs[current_state])
            # 从新状态的观测概率分布中采样观测值
            next_observation = self.sample_from_distribution(self.emission_probs[next_state])
            observations.append(next_observation)
            current_state = next_state  # 更新当前状态

        return observations

    def forward_algorithm(self, observations):
        """
        使用前向算法计算给定观测序列的概率。

        :param observations: 观测序列
        :return: 观测序列的概率
        """
        # 初始化前向概率矩阵
        alpha = self.initial_probs * self.emission_probs[:, observations[0]]

        # 递归计算前向概率
        for observation in observations[1:]:
            alpha = np.dot(alpha, self.transition_probs) * self.emission_probs[:, observation]

        # 返回观测序列的概率
        return np.sum(alpha)


if __name__ == '__main__':
    # 初始化 HMM 模型参数
    # 初始状态概率, 即选择第一个盒子的概率
    initial_probs = np.array([0.3, 0.2, 0.2, 0.3])
    # 状态转移概率矩阵
    transition_probs = np.array([
        [0.1, 0.6, 0.2, 0.1],  # 从第1个盒子转移到其他盒子的概率
        [0.3, 0.1, 0.4, 0.2],  # 从第2个盒子转移到其他盒子的概率
        [0.2, 0.3, 0.1, 0.4],  # 从第3个盒子转移到其他盒子的概率
        [0.5, 0.2, 0.2, 0.1]  # 从第4个盒子转移到其他盒子的概率
    ])
    # 观测概率矩阵,也称发射概率矩阵
    emission_probs = np.array([
        [0.4, 0.6],  # 第1个盒子中抽到红色和白色球的概率
        [0.7, 0.3],  # 第2个盒子中抽到红色和白色球的概率
        [0.5, 0.5],  # 第3个盒子中抽到红色和白色球的概率
        [0.6, 0.4]  # 第4个盒子中抽到红色和白色球的概率
    ])

    # 观测值到颜色的映射
    observation_to_color = {0: '红色', 1: '白色'}

    # 确保参数的维度一致
    assert len(transition_probs) == len(initial_probs)
    assert len(transition_probs) == len(emission_probs)

    # 创建 HMM 对象
    hmm = HiddenMarkovModel(
        num_states=emission_probs.shape[0],
        num_observations=emission_probs.shape[1],
        initial_probs=initial_probs,
        transition_probs=transition_probs,
        emission_probs=emission_probs
    )

    # 生成一个长度为 5 的观测序列
    observation_sequence = hmm.generate_observations(5)
    print("生成的观测序列:", observation_sequence)
    print("生成的观测序列对应的颜色:", [observation_to_color[o] for o in observation_sequence])

    # 使用前向算法计算观测序列的概率
    observation_probability = hmm.forward_algorithm(observation_sequence)
    print("观测序列的概率:", observation_probability)

生成的观测序列: [1, 1, 1, 0, 0]
生成的观测序列对应的颜色: ['白色', '白色', '白色', '红色', '红色']
观测序列的概率: 0.02654901 

 

标签:概率,self,probs,观测,马尔可夫,num,observations,模型
From: https://blog.csdn.net/weixin_74254879/article/details/140508702

相关文章

  • 【LLM大模型】《开源大模型食用指南》全网发布,轻松助你速通llm大模型!
    前言《开源大模型食用指南》是一个围绕开源大模型、针对国内初学者、基于AutoDL平台的中国宝宝专属大模型教程,针对各类开源大模型提供包括环境配置、本地部署、高效微调等技能在内的全流程指导,简化开源大模型的部署、使用和应用流程,让更多的普通学生、研究者更好地使用......
  • 大模型网信办备案全网最详细说明【附流程+附件】
    本文共分为以下几个章节一、大模型算法备案的强制性二、生成式人工智能(大语言模型)安全评估要点三、大模型备案必备材料+重点说明四、大模型备案填报流程五、大模型备案时间成本对比六、备案建议附录、过程性材料一、大模型算法备案的强制性1、强制要求备案(1)《办法》第六条......
  • 多进程模型
    多进程模型基于最原始的阻塞网络I/O,如果服务器要支持多个客户端,其中比较传统的方式,就是使用多进程模型,也就是为每个客户端分配一个进程来处理请求。服务器的主进程负责监听客户的连接,一旦与客户端连接完成,accept()函数就会返回一个「已连接Socket」,这时就通过fork()函数创......
  • 使用gradio部署微调后的模型
    文章目录概要整体架构流程技术细节小结概要使用gradio部署微调后的模型整体架构流程gradio前期学习,以下是一些常见的输入输出组件,有些即可输入也可输出gr.Audio(sources=['microphone','upload'],#音频输入sources,支持录制或者上传音频文件......
  • 含光AI心理大模型:AI 心理助手,随时待命,伴你左右
    “我感觉自己毫无用处,做什么都不顺。”“焦虑让我窒息,没人能帮我。”……在当今这个快速变化的世界,我们每个人都可能会遇到压力和挑战,这些压力和挑战有时会让我们感到焦虑、失落,甚至自我怀疑。我们的内心可能充满了未被听见的声音,这些声音是我们情感状态的真实写照,它们渴望......
  • 大模型的短期记忆和上期记忆各自的使用场景
    吾名爱妃,性好静亦好动。好编程,常沉浸于代码之世界,思维纵横,力求逻辑之严密,算法之精妙。亦爱篮球,驰骋球场,尽享挥洒汗水之乐。且喜跑步,尤钟马拉松,长途奔袭,考验耐力与毅力,每有所进,心甚喜之。 吾以为,编程似布阵,算法如谋略,需精心筹谋,方可成就佳作。篮球乃团队之艺,协作共进,方显力......
  • 【十分钟学会微调大语言模型 】
    有同学给我留言说想知道怎么训练自己的大语言模型,让它更贴合自己的业务场景。完整的大语言模型训练成本比较高昂,不是我们业余玩家能搞的,如果我们只是想在某个业务场景或者垂直的方面加强大模型的能力,可以进行微调训练。本文就来介绍一种大语言模型微调的方法,使用的工具是我......
  • 苹果大模型系列之 从头开始在 Apple Silicon 上进行 ComfyUI(教程含完整步骤)
    简介如何在搭载AppleSilicon的MacBookPro上安装ComfyUI,并开始使用StableDiffusion创作AI生成的艺术作品。无需开发技能。在安装了Python3.9的M1MacBookPro和安装了Python3.10的M1MaxMacBookPro上进行了测试,均使用macOSSonoma14.1.2。本地......
  • 探索混合专家(MoE)模型预训练:开源项目实操
    探索混合专家(MoE)模型预训练:开源项目实操Mantaverse 来自知乎​目录收起MOE模型是什么实现Moe模型实现步骤拆解1.初始化和形状调整2.计算路由器的logits3.初始化和创建专家掩码4.循环计算专家层输出5.恢复形状并返回结果预训练效果对比DeepseekMoE结语......
  • 大模型长度扩展:直接外推, PI, NTK-aware, NTK-by-parts, Dynamic NTK, ALiBi, YaRN, S
    目录第一部分背景知识:从进制表示谈到直接外推、线性内插、进制转换1.1从进制表示到直接外推1.1.1进制表示1.1.2直接外推1.2从线性内插到进制转换1.2.1线性内插1.2.2进制转换第二部分从RoPE、直接外推到位置内插PositionInterpolation2.1旋转位置嵌入2.1.1RoPE的快速回......