用python实现隐马尔科夫(HMM)

import numpy as np

class HiddenMarkovModel:
    def __init__(self, states, observations, start_prob, transition_prob, emission_prob):
        self.states = states
        self.observations = observations
        self.start_prob = start_prob
        self.transition_prob = transition_prob
        self.emission_prob = emission_prob

    def forward(self, observations):
        T = len(observations)
        N = len(self.states)

        # 初始化前向概率矩阵
        alpha = np.zeros((T, N))

        # 计算初始时刻的前向概率
        alpha[0, :] = self.start_prob * self.emission_prob[:, self.observations.index(observations[0])]

        # 递推计算前向概率
        for t in range(1, T):
            for j in range(N):
                alpha[t, j] = np.sum(alpha[t-1, i] * self.transition_prob[i, j] * self.emission_prob[j, self.observations.index(observations[t])] for i in range(N))

        return alpha

    def backward(self, observations):
        T = len(observations)
        N = len(self.states)

        # 初始化后向概率矩阵
        beta = np.zeros((T, N))

        # 设置初始时刻的后向概率
        beta[T-1, :] = 1

        # 递推计算后向概率
        for t in range(T-2, -1, -1):
            for i in range(N):
                beta[t, i] = np.sum(self.transition_prob[i, j] * self.emission_prob[j, self.observations.index(observations[t+1])] * beta[t+1, j] for j in range(N))

        return beta

    def forward_backward(self, observations):
        alpha = self.forward(observations)
        beta = self.backward(observations)

        # 计算估计的状态概率
        state_prob = alpha * beta / np.sum(alpha * beta, axis=1, keepdims=True)

        return state_prob

# 示例
states = ['Healthy', 'Fever']
observations = ['normal', 'cold', 'dizzy']
start_prob = np.array([0.6, 0.4])
transition_prob = np.array([[0.7, 0.3], [0.4, 0.6]])
emission_prob = np.array([[0.5, 0.4, 0.1], [0.1, 0.3, 0.6]])

hmm = HiddenMarkovModel(states, observations, start_prob, transition_prob, emission_prob)

# 计算前向概率
observations_sequence = ['normal', 'cold', 'dizzy']
alpha = hmm.forward(observations_sequence)
print("Forward probabilities:")
print(alpha)

# 计算后向概率
beta = hmm.backward(observations_sequence)
print("\nBackward probabilities:")
print(beta)

# 计算状态概率
state_prob = hmm.forward_backward(observations_sequence)
print("\nEstimated state probabilities:")
print(state_prob)

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终是蝶衣梦晓楼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值