HMM 隐马尔科夫 Python 代码

 1 import numpy as np
 2 # -*- codeing:utf-8 -*-
 3 __author__ = 'youfei'
 4 
 5 #   隐状态
 6 hidden_state = ['sunny', 'rainy']
 7 
 8 #   观测序列
 9 obsevition = ['walk', 'shop', 'clean']
10 
11 
12 #   根据观测序列、发射概率、状态转移矩阵、发射概率
13 #   返回最佳路径
14 def compute(obs, states, start_p, trans_p, emit_p):
15     #   max_p(3*2)每一列存储第一列不同隐状态的最大概率
16     max_p = np.zeros((len(obs), len(states)))
17 
18     #   path(2*3)每一行存储上max_p对应列的路径
19     path = np.zeros((len(states), len(obs)))
20 
21     #   初始化
22     for i in range(len(states)):
23         max_p[0][i] = start_p[i] * emit_p[i][obs[0]]
24         path[i][0] = i
25 
26     for t in range(1, len(obs)):
27         newpath = np.zeros((len(states), len(obs)))
28         for y in range(len(states)):
29             prob = -1
30             for y0 in range(len(states)):
31                 nprob = max_p[t-1][y0] * trans_p[y0][y] * emit_p[y][obs[t]]
32                 if nprob > prob:
33                     prob = nprob
34                     state = y0
35                     #   记录路径
36                     max_p[t][y] = prob
37                     for m in range(t):
38                         newpath[y][m] = path[state][m]
39                     newpath[y][t] = y
40 
41         path = newpath
42 
43     max_prob = -1
44     path_state = 0
45     #   返回最大概率的路径
46     for y in range(len(states)):
47         if max_p[len(obs)-1][y] > max_prob:
48             max_prob = max_p[len(obs)-1][y]
49             path_state = y
50 
51     return path[path_state]
52 
53 
54 state_s = [0, 1]
55 obser = [0, 1, 2]
56 
57 #   初始状态,测试集中,0.6概率观测序列以sunny开始
58 start_probability = [0.6, 0.4]
59 
60 #   转移概率,0.7:sunny下一天sunny的概率
61 transititon_probability = np.array([[0.7, 0.3], [0.4, 0.6]])
62 
63 #   发射概率,0.4:sunny在0.4概率下为shop
64 emission_probability = np.array([[0.1, 0.4, 0.5], [0.6, 0.3, 0.1]])
65 
66 result = compute(obser, state_s, start_probability, transititon_probability, emission_probability)
67 
68 for k in range(len(result)):
69     print(hidden_state[int(result[k])])

 

转载于:https://www.cnblogs.com/cupleo/p/9705029.html

### Python马尔科夫模型数据分析库及示例代码 Python 中有多个库可以用于马尔科夫模型(HMM)的数据分析。以下是一些常用的库及其示例代码: #### 1. 使用 `hmmlearn` 库 `hmmlearn` 是一个基于 scikit-learn 的库,专门用于实现马尔科夫模型。它提供了简单易用的接口来构建和训练 HMM 模型。 ```python from hmmlearn import hmm import numpy as np # 创建一个高斯分布的 HMM 模型 model = hmm.GaussianHMM(n_components=3, covariance_type="diag", n_iter=100) # 示例数据:假设我们有一组时间序列数据 data = np.array([[0.5], [1.0], [-1.0], [2.0], [3.0], [-2.0]]) # 训练模型 model.fit(data) # 输出模型参数 print("Transition matrix:\n", model.transmat_) # 转移矩阵[^1] print("Means and variances of each hidden state:") for i in range(model.n_components): print(f"Hidden state {i}:") print(f"Mean = {model.means_[i]}") print(f"Variance = {np.diag(model.covars_[i])}") ``` #### 2. 使用 `pomegranate` 库 `pomegranate` 是另一个强大的概率图模型库,支持马尔科夫模型和其他复杂的概率模型。 ```python from pomegranate import HiddenMarkovModel, State, DiscreteDistribution # 定义状态 sunny = State(DiscreteDistribution({'walk': 0.1, 'shop': 0.4, 'clean': 0.5}), name="sunny") rainy = State(DiscreteDistribution({'walk': 0.6, 'shop': 0.3, 'clean': 0.1}), name="rainy") # 创建 HMM model = HiddenMarkovModel() model.add_states(sunny, rainy) # 添加转移概率 model.add_transition(model.start, sunny, 0.5) model.add_transition(model.start, rainy, 0.5) model.add_transition(sunny, sunny, 0.8) model.add_transition(sunny, rainy, 0.2) model.add_transition(rainy, sunny, 0.4) model.add_transition(rainy, rainy, 0.6) # 结束状态 model.bake() # 示例预测 sequence = ['walk', 'shop', 'clean'] logp, path = model.viterbi(sequence) print("Sequence:", sequence) print("Most likely states:", path) ``` #### 3. 使用 `statsmodels` 库 `statsmodels` 提供了统计建模的功能,也支持马尔科夫模型的实现。 ```python import numpy as np import pandas as pd import statsmodels.api as sm # 示例数据 index = pd.date_range(start='2023-01-01', periods=100, freq='D') data = np.random.normal(size=100).cumsum() data = pd.Series(data, index=index) # 创建 HMM 模型 mod_hmm = sm.tsa.MarkovAutoregression( data, k_regimes=2, order=0, switching_ar=False ) # 拟合模型 res_hmm = mod_hmm.fit() # 输出结果 print(res_hmm.summary()) ``` ### 注意事项 - 在使用这些库时,请确保安装了所需的依赖项。例如,可以通过 `pip install hmmlearn pomegranate statsmodels` 安装相关库。 - 数据预处理是关键步骤,尤其是对于时间序列数据,可能需要进行归一化或标准化处理[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值