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)
用python实现隐马尔科夫(HMM)
最新推荐文章于 2024-08-08 14:28:23 发布