株式市場の予測問題で隠れマルコフ モデルをいじっています。私のデータ マトリックスには、特定の証券のさまざまな機能が含まれています。
01-01-2001, .025, .012, .01
01-02-2001, -.005, -.023, .02
シンプルな GaussianHMM に適合します。
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]))
上記で、テスト セットの最初の 5 つのインスタンスを含む観測ベクトル O t = (O 1 , O 2 , ..., O d )の隠れ状態シーケンスをデコードしました。テスト セットの 6 番目のインスタンスの隠れ状態を推定したいと思います。アイデアは、6 番目のインスタンスの可能な特徴値の離散セットを反復処理し、観測シーケンス O t+1を選択することです。argmax = P(O 1 , O 2 , ..., O d+1 | λ )。O d+1の真の特徴値を観察したら、(長さ 5 の) シーケンスを 1 つシフトして、最初からやり直すことができます。
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をデコードすると、最も可能性の高い予測がほぼ常に同じになることです (たとえば、最も可能性の高い推定は常に[ 0.04 0.04 0.04] に等しいO d+1の特徴値を持ち、は非表示状態 [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 | λ) を最大化するにはどうすればよいでしょうか?