首页 > 编程语言 >Python 机器学习 HMM模型三种经典问题

Python 机器学习 HMM模型三种经典问题

时间:2024-03-19 22:57:00浏览次数:29  
标签:probability Python 观测 states HMM np 三种 序列 obs

 隐马尔可夫模型(Hidden Markov Model, HMM)是一个强大的工具,用于模拟具有隐藏状态的时间序列数据。HMM广泛应用于多个领域,如语音识别、自然语言处理和生物信息学等。在处理HMM时,主要集中于三个经典问题:评估问题、解码问题和学习问题。三个问题构成了使用隐马尔可夫模型时的基础框架,使得HMM不仅能够用于模拟复杂的时间序列数据,还能够从数据中学习和预测。

参考文档:Python 机器学习 HMM模型三种经典问题-CJavaPy

1、评估问题

在隐马尔可夫模型(Hidden Markov Model, HMM)的应用中,评估问题是指确定一个给定的观测序列在特定HMM参数下的概率。简而言之,就是评估一个模型生成某个观测序列的可能性有多大。模型评估问题通常使用前向算法解决。前向算法是一个动态规划算法,它通过累积“前向概率”来计算给定观测序列的概率。前向概率定义为在时间点t观察到序列的前t个观测,并且系统处于状态i的概率。算法的核心是递推公式,它利用前一时刻的前向概率来计算当前时刻的前向概率。

import numpy as np

# 定义模型参数
states = {'Rainy': 0, 'Sunny': 1}
observations = ['walk', 'shop', 'clean']
start_probability = np.array([0.6, 0.4])
transition_probability = np.array([[0.7, 0.3], [0.4, 0.6]])
emission_probability = np.array([[0.1, 0.4, 0.5], [0.6, 0.3, 0.1]])

# 观测序列,用索引表示
obs_seq = [0, 1, 2]  # 对应于 'walk', 'shop', 'clean'

# 初始化前向概率矩阵
alpha = np.zeros((len(obs_seq), len(states)))

# 初始化
alpha[0, :] = start_probability * emission_probability[:, obs_seq[0]]

# 递推计算
for t in range(1, len(obs_seq)):
    for j in range(len(states)):
        alpha[t, j] = np.dot(alpha[t-1, :], transition_probability[:, j]) * emission_probability[j, obs_seq[t]]

# 序列的总概率为最后一步的概率之和
total_prob = np.sum(alpha[-1, :])

print("Forward Probability Matrix:")
print(alpha)
print("\nTotal Probability of Observations:", total_prob)

2、解码问题

在隐马尔可夫模型(Hidden Markov Model, HMM)中,解码问题是指给定一个观测序列和模型参数,找出最有可能产生这些观测的隐状态序列。这个问题的核心是如何从已知的观测数据中推断出隐含的状态序列,这在许多应用场景中非常有用,如语音识别、自然语言处理、生物信息学等。解决这一问题最常用的算法是维特比算法,一种动态规划方法,它通过计算并记录达到每个状态的最大概率路径,从而找到最可能的状态序列。

import numpy as np

def viterbi(obs, states, start_p, trans_p, emit_p):
    """
    Viterbi Algorithm for solving the decoding problem of HMM
    obs: 观测序列
    states: 隐状态集合
    start_p: 初始状态概率
    trans_p: 状态转移概率矩阵
    emit_p: 观测概率矩阵
    """
    V = [{}]
    path = {}

    # 初始化
    for y in states:
        V[0][y] = start_p[y] * emit_p[y][obs[0]]
        path[y] = [y]

    # 对序列从第二个观测开始进行运算
    for t in range(1, len(obs)):
        V.append({})
        newpath = {}

        for cur_state in states:
            # 选择最可能的前置状态
            (prob, state) = max((V[t-1][y0] * trans_p[y0][cur_state] * emit_p[cur_state][obs[t]], y0) for y0 in states)
            V[t][cur_state] = prob
            newpath[cur_state] = path[state] + [cur_state]

        # 不更新path
        path = newpath

    # 返回最终路径和概率
    (prob, state) = max((V[len(obs) - 1][y], y) for y in states)
    return (prob, path[state])

# 定义状态、观测序列及模型参数
states = ('Rainy', 'Sunny')
observations = ('walk', 'shop', 'clean')
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
transition_probability = {
   'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
   'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
}
emission_probability = {
   'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
   'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}

# 应用维特比算法
result = viterbi(observations,
                 states,
                 start_probability,
                 transition_probability,
                 emission_probability)
print(result)

3、学习问题

理解隐马尔可夫模型(HMM)的模型学习问题关键在于确定模型参数,以最大化给定观测序列的出现概率。解决这一学习问题的常用方法是鲍姆-韦尔奇算法,这是一种迭代算法,通过交替执行期望步骤(E步骤)和最大化步骤(M步骤)来找到最大化观测序列概率的参数。E步骤计算隐状态的期望值,而M步骤则更新模型参数以最大化观测序列的概率。这一过程会持续重复,直至满足一定的收敛条件,如参数变化量低于特定阈值或达到预设的迭代次数。通过这种方式解决学习问题,我们可以获得一组能够很好解释给定观测数据的模型参数,这表明模型能够捕捉到观测数据中的统计规律,用于生成观测序列、预测未来观测值或识别新观测序列中的模式。

import numpy as np
from hmmlearn import hmm

# 假设我们有一组观测数据,这里我们随机生成一些数据作为示例
# 实际应用中,你应该使用真实的观测数据
n_samples = 1000
n_components = 3  # 假设我们有3个隐状态
obs_dim = 2  # 观测数据的维度,例如二维的观测空间

# 随机生成观测数据
np.random.seed(42)
obs_data = np.random.rand(n_samples, obs_dim)

# 初始化GaussianHMM模型
# 这里我们指定了n_components隐状态数量和covariance_type协方差类型
model = hmm.GaussianHMM(n_components=n_components, covariance_type='full', n_iter=100)

# 使用观测数据训练模型
# 注意:实际应用中的数据可能需要更复杂的预处理步骤
model.fit(obs_data)

# 打印学习到的模型参数
print("学习到的转移概率矩阵:")
print(model.transmat_)
print("\n学习到的均值:")
print(model.means_)
print("\n学习到的协方差:")
print(model.covars_)

4、三种经典问题案例

深入理解隐马尔可夫模型(HMM)处理的三种经典问题——评估问题、解码问题和学习问题,可以将通过一个完整的示例来展示这些问题的应用和解决方案。如有一个简单的天气模型,其中的状态(隐藏状态)包括晴天(Sunny)和雨天(Rainy),观测(可见状态)包括人们的三种活动:散步(Walk)、购物(Shop)和清洁(Clean)。可以使用HMM来处理评估问题、解码问题和学习问题。

from hmmlearn import hmm
import numpy as np

# 定义模型参数
states = ["Rainy", "Sunny"]
n_states = len(states)

observations = ["walk", "shop", "clean"]
n_observations = len(observations)

start_probability = np.array([0.6, 0.4])

transition_probability = np.array([
    [0.7, 0.3],
    [0.4, 0.6],
])

emission_probability = np.array([
    [0.1, 0.4, 0.5],
    [0.6, 0.3, 0.1],
])

# 创建模型
model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_ = start_probability
model.transmat_ = transition_probability
model.emissionprob_ = emission_probability
model.n_trials = 4

# 观测序列
obs_seq = np.array([[0], [1], [2]]).T  # 对应于观测序列 ['walk', 'shop', 'clean']

# 计算观测序列的概率
logprob = model.score(obs_seq)
print(f"Observation sequence probability: {np.exp(logprob)}")

# 继续使用上面的模型参数和观测序列

# 使用Viterbi算法找出最可能的状态序列
logprob, seq = model.decode(obs_seq, algorithm="viterbi")
print(f"Sequence of states: {', '.join(map(lambda x: states[x], seq))}")

# 假设我们只有观测序列,不知道模型参数
obs_seq = np.array([[0], [1], [2], [0], [1], [2]]).T  # 扩展的观测序列

# 初始化模型
model = hmm.MultinomialHMM(n_components=n_states, n_iter=100)
model.fit(obs_seq)

# 打印学习到的模型参数
print("Start probabilities:", model.startprob_)
print("Transition probabilities:", model.transmat_)
print("Emission probabilities:", model.emissionprob_)

 参考文档:Python 机器学习 HMM模型三种经典问题-CJavaPy

标签:probability,Python,观测,states,HMM,np,三种,序列,obs
From: https://www.cnblogs.com/tinyblog/p/18084170

相关文章

  • 一文了解Python中的运算
    Python的运算符和其他语言类似数学运算>>>print 1+9        # 加法>>>print 1.3-4      # 减法>>>print 3*5        # 乘法>>>print 4.5/1.5    # 除法>>>print 3**2       # 乘方     >>>print 10%3      ......
  • Python小白的福利之基本数据类型
    简单的数据类型以及赋值变量不需要声明Python的变量不需要声明,你可以直接输入:>>>a = 10那么你的内存里就有了一个变量a,它的值是10,它的类型是integer(整数)。在此之前你不需要做什么特别的声明,而数据类型是Python自动决定的。>>>print a>>>print type(a)那......
  • Python 数据持久层ORM框架 TorToise模块(异步)
    文章目录TortoiseORM简介TortoiseORM特性TortoiseORM安装TortoiseORM数据库支持TortoiseORM创建模型aerich迁移工具简介aerich迁移工具安装aerich迁移工具使用TrotoiseORM查询数据TrotoiseORM修改数据TrotoiseORM删除数据TrotoiseORM新增数据......
  • 【蓝桥杯选拔赛真题70】python最短路径和 第十五届青少年组蓝桥杯python选拔赛真题 算
    目录python最短路径和一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、 推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python最短路径和第十五届蓝桥杯青少年组python比赛选拔赛真题一、题目要求(注:i......
  • Python的优点和缺点(详细解说版本)——《跟老吕学Python编程》附录资料
    Python的优点和缺点(详细解说版本)——《跟老吕学Python编程》附录资料Python的优点和缺点Python的优点Python语法简单Python是开源的程序员使用Python编写的代码是开源的。Python解释器和模块是开源的。Python是免费的Python是高级语言Python是解释型语言,能跨平......
  • Python面向对象编程之多态你学会了吗?
    在Python面向对象编程中,多态是一个非常重要的概念。多态意味着一个接口可以有多种实现方式,或者说一个接口可以被多种对象所实现。这在编程中非常重要,因为它可以帮助我们编写更加灵活和可扩展的代码。想象一下,如果你有一个函数,它需要处理不同的对象,但是这些对象都实现了同一......
  • Python面向对象编程之多继承,你真的懂了吗?
    hi,大家好!今天我们来聊聊Python面向对象编程中的一个重要概念——多继承!如果你还没搞清楚这个概念,那就赶紧跟着我一起学习吧!首先,我们来了解一下什么是继承。在面向对象编程中,继承是一个让子类可以继承父类的属性和方法的机制。这样,我们就可以避免重复编写相同的代码,并且让代......
  • python27安装pygame
    参考:https://cloud.tencent.com/developer/article/2089701我安装的是1.9.3版本https://pypi.org/project/pygame/1.9.3/#files按照自己本地的环境下载,比如我的是python27,windows64,我安装的就是 pygame-1.9.3-cp27-cp27m-win_amd64.whl安装命令:pipinstallxxxx.whl 试......
  • whisper-large-v3:速度快的令人翻译模型三种实用的调用方法
    1、whisper-large-v3是openai公司的模型,可使用Python代码调用;2、whisper-large-v3基础上chenxwh制作了开源库insanely-fast-whisper,可本地指令运行,或GoogleColabT4GPU运行;3、以上两个模型应用,如果觉得使用复杂难度大,国内软件工程师制作了更简单的版本fast-whisper3。......
  • Python中的深拷贝与浅拷贝有什么区别?
    在Python中,深拷贝和浅拷贝是处理复合对象(例如列表、字典等含有其他对象的对象)时常用到的两种方法。它们之间的主要区别在于复制过程中对内嵌对象的处理方式。###浅拷贝(ShallowCopy)浅拷贝创建了一个新对象,其内容是对原始对象中内容的引用。这意呀着,如果原始对象中的元......