首页 文章

隐马尔可夫模型使用hmmlearn收敛到一个状态

提问于
浏览
0

我有一个机器学习问题,我正在努力解决 . 我正在使用具有5种状态的高斯HMM(来自hmmlearn),在序列中模拟极端负,负,中性,正和极端正 . 我在下面的要点中设置了模型

https://gist.github.com/stevenwong/cb539efb3f5a84c8d721378940fa6c4c

import numpy as np
import pandas as pd
from hmmlearn.hmm import GaussianHMM

x = pd.read_csv('data.csv')
x = np.atleast_2d(x.values)

h = GaussianHMM(n_components=5, n_iter=10, verbose=True, covariance_type="full")
h = h.fit(x)
y = h.predict(x)

问题在于,大多数估计的状态会收敛到中间,即使我可以明显地看到有正值的黑桃和负值的黑桃,但它们都集中在一起 . 知道如何让它更好地适应数据吗?

enter image description here

编辑1:

这是转换矩阵 . 我相信它在hmmlearn中读取的方式是跨越行(即,行[0]表示转移到自身的概率,状态1,2,3 ......)

In [3]: h.transmat_
Out[3]:
array([[ 0.19077231,  0.11117929,  0.24660208,  0.20051377,  0.25093255],
       [ 0.12289066,  0.17658589,  0.24874935,  0.24655888,  0.20521522],
       [ 0.15713787,  0.13912972,  0.25004413,  0.22287976,  0.23080852],
       [ 0.14199694,  0.15423031,  0.25024992,  0.2332739 ,  0.22024893],
       [ 0.17321093,  0.12500688,  0.24880728,  0.21205912,  0.2409158 ]])

如果我将所有转换probs设置为0.2,它看起来像这样(如果我按状态平均分离更糟) .

enter image description here

1 回答

  • 1

    显然,你的模型学会了状态2的大变化.GMM是一个用最大似然标准训练的生成模型,所以从某种意义上说,你得到了数据的最佳拟合 . 我可以看到它在极端情况下提供有意义的预测,所以如果你想让它将更多的观察结果归属于2以外的类,我会尝试以下方法:

    • 数据预处理 . 尝试使用输入的日志值来使它们之间的区别更加清晰 .

    • 看看你的转换矩阵,也许转换来自状态2的probs太低了 . 尝试将所有概率设置为相等,然后查看会发生什么 .

相关问题