我是隐马尔可夫模型的新手,为了试验它,我在 Python中的hmmlearn 包的帮助下,根据观察一个人是否携带雨伞来研究晴天/雨天/雾天天气的场景。我的测试中使用的数据是从这个页面获得的(“测试1”的测试和输出文件)。
我创建了下面给出的简单代码,以根据测试数据拟合无监督 HMM,然后将预测与预期输出进行比较。结果看起来相当不错(10 个正确预测中有 7 个)。
我的问题是:我应该如何知道模型处理的隐藏状态到问题域中真实状态的映射?(换句话说,我如何将响应与我的问题域的期望状态联系起来?)
这可能是一个非常幼稚的问题,但如果模型受到监督,我会理解映射是我在为 fit 方法提供 Y 值时给出的......但我根本无法弄清楚它在这种情况下是如何工作的.
代码:
import numpy as np
from hmmlearn import hmm
# Load the data from a CSV file
data = np.genfromtxt('training-data.csv', skip_header=1, delimiter=',',
dtype=str)
# Hot encode the 'yes' and 'no' categories of the observation
# (i.e. seeing or not an umbrella)
x = np.array([[1, 0] if i == 'yes' else [0, 1] for i in data[:, 1]])
# Fit the HMM from the data expecting 3 hidden states (the weather on the day:
# sunny, rainy or foggy)
model = hmm.GaussianHMM(n_components=3, n_iter=100, verbose=True)
model.fit(x, [len(x)])
# Test the model
test = ['no', 'no', 'no', 'yes', 'no', 'no', 'yes', 'yes', 'no', 'yes']
x_test = np.array([[1, 0] if i == 'yes' else [0, 1] for i in test])
y_test = ['foggy', 'foggy', 'foggy', 'rainy', 'sunny', 'foggy', 'rainy', 'rainy', 'foggy', 'rainy']
y_pred = model.predict(x_test)
mp = {0: 'sunny', 1: 'rainy', 2: 'foggy'} # THIS IS MY ASSUMPTION
print('\n\n\n')
print('Expected:')
print(y_test)
print('Predicted:')
print([mp[i] for i in y_pred])
结果:
Expected: ['foggy', 'foggy', 'foggy', 'rainy', 'sunny', 'foggy', 'rainy', 'rainy', 'foggy', 'rainy'] Predicted: ['foggy', 'foggy', 'sunny', 'rainy', 'foggy', 'sunny', 'rainy', 'rainy', 'foggy', 'rainy']