0

GMMHMM の gmms_ 属性で使用するために、いくつかの GMM を初期化しようとしています。各 GMM インスタンスは、異なる平均、重み、および共分散を持ち、GMMHMM の 5 成分混合の成分として機能します。平均、重み、および共分散は、適合させたいデータセットの (5 クラスター) k-means アルゴリズムから決定されます。ここで、平均は各クラスターの中心であり、重みは各クラスターの重みであり、共分散は、ご想像のとおり、各クラスターの共分散です。

コード スニペットを次に示します。

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 を使用するのは初めてです。このエラーを修正するにはどうすればよいですか?

4

1 に答える 1

1

2 成分のガウス混合物からのランダム サンプルを使用して、問題を再現できました。

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 次元ガウスの共分散行列は単なるスカラーであるため、これは明らかに望んでいるものではありません。

cluster解決策は、に渡す前に転置することnp.covです:

np.cov(cluster.T)    # has shape () aka scalar

3DXに切り替えた後、さらに 2 つの問題を発見しました。

  • n_mixは a の成分数であり、マルコフ連鎖状態の数 (または同等の混合数)GMMを指します。コンストラクターに渡してから、 5 つのインスタンスを に追加するn_componentsことに注意してください。n_components=4GMMHMMGMMmodel.gmms_
  • さらに、GMMHMM事前入力model.gmms_されるため、最終的n_components + 5には 4 つの混合ではなく、(9, )不一致が説明されます。

更新されたコード:

#      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_``.
于 2016-05-10T22:53:54.590 に答える