2016-05-08 7 views
0

GMMHMMのgmms_属性で使用するいくつかのGMMを初期化しようとしています。各GMMインスタンスは、異なる平均、重みおよび共分散を有し、GMMHMMの5成分混合物の成分として役立つ。平均、重みおよび共分散は、適合させたいデータセットの(5クラスタ)k平均アルゴリズムから求められ、平均は各クラスタの中心であり、重みは各クラスタの重みであり、共分散は - あなたが推測する - 各クラスタの共分散です。ここでHMMlearn GMMHMMエラー

は、コードスニペットです:

X_clusters = cls.KMeans(n_clusters=5) 
fitted_X = X_clusters.fit(X) 
means = fitted_X.cluster_centers_ 
cluster_arrays = extract_feat(X, fitted_X.labels_) 
print ('Means: {0}'.format(means)) 

total_cluster = float(len(X)) 
all_GMM_params = [] 
for cluster in cluster_arrays: 
    GMM_params = [] 
    weight = float(len(cluster))/total_cluster 
    covar = np.cov(cluster) 
    GMM_params.append(weight) 
    GMM_params.append(covar) 
    all_GMM_params.append(GMM_params) 

for i in range(len(means)): 
    all_GMM_params[i].append(means[i]) 


model = GMMHMM(n_components=4, covariance_type="diag", n_iter=1000, 
      n_mix = 5, algorithm='map') 

for i in range(len(all_GMM_params)): 
    GMM_n = mix.GMM(init_params = '') 
    GMM_n.weights_ = np.array(all_GMM_params[i][0]) 
    GMM_n.covars_ = np.array(all_GMM_params[i][1]) 
    GMM_n.means_ = np.array(all_GMM_params[i][2]) 
    model.gmms_.append(GMM_n) 

model.fit(X) 

私がモデルに合うようにしようとすると、しかし、私は次のエラーを取得する:

fitting to HMM and decoding ...Traceback (most recent call last): 
    File "HMM_stock_sim.py", line 156, in <module> 
    model.fit(X) 
    File "C:\Python27\lib\site-packages\hmmlearn\base.py", line 436, in fit 
    bwdlattice) 
    File "C:\Python27\lib\site-packages\hmmlearn\hmm.py", line 590, in _accumulate 
_sufficient_statistics 
    stats, X, framelogprob, posteriors, fwdlattice, bwdlattice) 
    File "C:\Python27\lib\site-packages\hmmlearn\base.py", line 614, in _accumulat 
e_sufficient_statistics 
    stats['start'] += posteriors[0] 
ValueError: operands could not be broadcast together with shapes (4,) (9,) (4,) 

私は前に、このようなエラーを見たことがない、そのSklearnとHMMlearnと一緒に仕事をしています。このエラーを修正するにはどうすればよいですか?

答えて

1

私は、二成分ガウス混合物からランダムなサンプルを使用して問題を再現することができました:

import numpy as np 

X = np.append(np.random.normal(0, size=1024), 
       np.random.normal(4, size=1024))[:, np.newaxis] 

は、だからここにあなたのコードが動作しない理由が私の感想です。 np.covは、与えられた配列の各行を変数として扱います。したがって、形状の配列が(N, 1)の場合、出力は形状(N, N)にバインドされます。明らかに、これはあなたが望むものではありません。なぜなら、1次元ガウス分布の共分散行列は単なるスカラであるからです。

ソリューションはnp.covに渡す前にclusterを転置することです:

3-D Xに切り替えた後
np.cov(cluster.T) # has shape() aka scalar 

私は2つの問題を発見しました:

  • n_mixですGMMの構成要素の数であり、n_componentsは、マルコフ連鎖状態の数(または等価混合物の数を減らす)。 n_components=4GMMHMMコンストラクタに渡してから、GMMインスタンスをmodel.gmms_に追加することに注意してください。
  • さらにGMMHMMmodel.gmms_にあらかじめ入力されていますので、(9,)の不一致を説明する4つの混合物の代わりにn_components + 5となります。

更新コード:

#  the updated parameter value. 
#    vvvvvvvvvvvvvv 
model = GMMHMM(n_components=5, covariance_type="diag", n_iter=1000, 
       n_mix=5, algorithm='map') 
#    ^^^^^^^ 
# doesn't have to match n_components 

for i, GMM_n in enumerate(model.gmms_): 
    GMM_n.weights_ = ... 
    # Change the attributes of an existing instance 
    # instead of appending a new one to ``model.gmms_``. 
+0

残念ながらも、クラスター配列を転置して、コバールを取得した後、私はまだ上記と同じエラーを取得します。 – Dider

+0

'X 'の形は何ですか?使用した合成データセットが使用しているものと一致しない可能性があります。 –

+0

Xの形:(268,3)すなわち(N、3) – Dider

関連する問題