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)

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

在此处输入图像描述

编辑1:

这是转移矩阵。我相信它在 hmmlearn 中的读取方式是跨行(即 row[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 ]])

如果我将所有转换概率设置为 0.2,它看起来像这样(如果我按状态进行平均,则分离会更糟)。

在此处输入图像描述

4

1 回答 1

1

显然,您的模型为状态 2 学习了很大的方差。GMM 是一个使用最大似然标准训练的生成模型,因此在某种意义上,您获得了与数据的最佳拟合。我可以看到它在极端情况下提供了有意义的预测,所以如果你想让它把更多的观察归因于 2 以外的类,我会尝试以下方法:

  1. 数据预处理。尝试为您的输入使用日志值,以使它们之间的差异更加清晰。
  2. 看看你的转换矩阵,也许状态 2 的转换概率太低了。尝试将所有概率设置为相等,看看会发生什么。
于 2016-12-23T10:38:11.503 回答