我对隐马尔可夫模型还不熟悉,我正在研究天气晴朗/多雨/多雾的情景,在hmmlearn包的帮助下,观察一个人是否带着雨伞。在我的测试中使用的数据来自此页 ( "test 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])结果:
预期:“雾”、“雨”、“晴”、“雾”、“雨”、“雨”、“雾”、“雨”预测:“雾”、“雾”、“晴”、“雨”、“雾”、“雨”、“雨”、“雾”、“雨”
发布于 2017-01-20 22:12:22
我的问题是:如何知道模型处理的隐藏状态到问题域中的真实状态的映射?(换句话说,如何将响应与问题域的期望状态关联起来?)
基本上,你不能。您能够手工绘制此映射(甚至它首先存在)的事实只是,这是一个来自问题极端简单性的巧合。
HMM (在这样的学习场景中)试图找到最可能的隐藏状态序列(预定义数量),但就像任何其他无监督学习一样,没有保证能够匹配手头的任务。它只是尽可能地对现实建模,考虑到约束条件(马尔可夫假设、隐藏状态数、所提供的观测)--它不能神奇地检测出一个人正在问的实际问题是什么(比如这里的天气序列),而只是试图解决自己的内部优化问题--这是任意定义的隐藏状态的最可能序列,因此在假设(独立于旧历史)下,所提供的观测很可能出现。
一般来说,你不可能如此容易地解释这些状态,这里的问题是如此简单,简单地用上面列出的假设-这个(天气状态)几乎是最有可能的事情,将被建模。在其他问题上,它可以捕捉到任何有意义的东西。
如前所述--这不是HMM属性,而是任何无监督的学习技术--当您对数据进行聚类时,您只会发现--一些数据分区,它可能与您正在寻找的内容有某种关系--或者没有。类似地,这里- HMM会找到一些动力学模型,但它可能与你所追求的完全不同。如果你知道你在寻找什么-你应该使用监督学习,这是字面上的定义。无监督学习是寻找的一些结构(这里是动态的),而不是特有的结构。
https://stackoverflow.com/questions/41674955
复制相似问题