Я играю со Скрытыми марковскими моделями для проблемы прогноза фондового рынка. Моя матрица данных содержит различные функции для конкретной безопасности:
01-01-2001, .025, .012, .01
01-02-2001, -.005, -.023, .02
Я подхожу к простому гауссовскому HMM:
from hmmlearn import GaussianHMM
mdl = GaussianHMM(n_components=3,covariance_type='diag',n_iter=1000)
mdl.fit(train[:,1:])
При модели (λ) я могу декодировать вектор наблюдения, чтобы найти наиболее вероятную скрытую последовательность состояний, соответствующую вектору наблюдения:
print mdl.decode(test[0:5,1:])
(72.75, array([2, 1, 2, 0, 0]))
Выше, я декодировал скрытую последовательность состояний вектора наблюдения O t= (O 1, O 2,..., O d), который содержит первые пять экземпляров в тестовом наборе. Я хотел бы оценить скрытое состояние шестого экземпляра в тестовом наборе. Идея состоит в том, чтобы перебирать дискретный набор возможных значений признаков для шестого экземпляра и выбирать последовательность наблюдения O t + 1 с наивысшим правдоподобием argmax = P (O 1, O 2,..., O d + 1 | λ). Как только мы увидим истинные значения функции O d + 1, мы можем сдвинуть последовательность (длины 5) на единицу и сделать это снова и снова:
l = 5
for i in xrange(len(test)-l):
values = []
for a in arange(-0.05,0.05,.01):
for b in arange(-0.05,0.05,.01):
for c in arange(-0.05,0.05,.01):
values.append(mdl.decode(vstack((test[i:i+l,1:],array([a,b,c])))))
print max(enumerate(values),key=lambda x: x[1])
Проблема заключается в том, что когда я декодирую вектор наблюдения O t + 1, предсказание с наивысшим правдоподобием почти всегда одно и то же (например, оценка с наивысшим правдоподобием всегда имеет значения признаков для O d + 1, что равно [0,04 0,04 0,04] и является скрытым состоянием [0]):
(555, (74.71248518927949, array([2, 1, 2, 0, 0, 0]))) [ 0.04 0.04 0.04]
(555, (69.41963358191555, array([2, 2, 0, 0, 0, 0]))) [ 0.04 0.04 0.04]
(555, (77.11516871816922, array([2, 0, 0, 0, 0, 0]))) [ 0.04 0.04 0.04]
Совершенно возможно, что я неправильно понимаю цель mdl.decode
и, следовательно, неправильно ее использовал. Если это так, как лучше всего я могу выполнить повторение возможных значений O d + 1, а затем максимизировать P (O 1, O 2,..., O d + 1 | λ)?