Scikit-learn: GMMのEMアルゴリズムは、0.16.1を使用する1次元データセットでは失敗します(ただし、0.15.2では問題ありません)

作成日 2015年05月13日  ·  4コメント  ·  ソース: scikit-learn/scikit-learn

GMM.fit()を使用して1次元のガウス分布を近似すると、scikit-learnバージョン0.16.1を使用してランタイムエラーが生成されますが、0.15.2を使用すると適切なパラメーターが生成されます。

問題を示す短い例:

import sklearn
from sklearn import mixture
import numpy as np
from scipy import stats
import sys

# the version info 
print("Python version: %s.%s" %(sys.version_info.major, sys.version_info.minor))
print("scikit-learn version: %s" %(sklearn.__version__))

# some pretend data
np.random.seed(seed=0)
data = stats.norm.rvs(loc=100, scale=1, size=1000)
print("Data mean = %s, Data std dev = %s" %(np.mean(data), np.std(data)))

# Fitting using a GMM with a single component
clf = mixture.GMM(n_components=1)
clf.fit(data)
print(clf.means_, clf.weights_, clf.covars_)

このサンプルコードをscikit-learn0.15.2で実行すると、正しい出力が生成されます。

Python version: 3.4
scikit-learn version: 0.15.2
Data mean = 99.9547432925, Data std dev = 0.987033158669
[[ 99.95474329]] [ 1.] [[ 0.97523446]]

ただし、scikit-learn 0.16.1を使用したまったく同じコードでは、次のトレースバックが得られます。

Python version: 3.4
scikit-learn version: 0.16.1
Data mean = 99.9547432925, Data std dev = 0.987033158669
/home/rebecca/anaconda/envs/new_sklearn/lib/python3.4/site-packages/numpy/lib/function_base.py:1890: RuntimeWarning: Degrees of freedom <= 0 for slice
  warnings.warn("Degrees of freedom <= 0 for slice", RuntimeWarning)
/home/rebecca/anaconda/envs/new_sklearn/lib/python3.4/site-packages/numpy/lib/function_base.py:1901: RuntimeWarning: invalid value encountered in true_divide
  return (dot(X, X.T.conj()) / fact).squeeze()
Traceback (most recent call last):
  File "test_sklearn.py", line 18, in <module>
    clf.fit(data)
  File "/home/rebecca/anaconda/envs/new_sklearn/lib/python3.4/site-packages/sklearn/mixture/gmm.py", line 498, in fit
    "(or increasing n_init) or check for degenerate data.")
RuntimeError: EM algorithm was never able to compute a valid likelihood given initial parameters. Try different init parameters (or increasing n_init) or check for degenerate data.

n_init、n_iter、covariance_typeパラメーターのさまざまな値を試しました。 また、さまざまなデータセットを試しました。 これらはすべて、0.16.1を使用するとこのエラーまたは同様のエラーになりますが、0.15.2を使用してもまったく問題はありません。 この問題は、期待値の最大化で使用される初期パラメーターに関連しているようです。したがって、これはこの問題に関連している可能性があります。#4429

これが有用な情報である場合、私はscikit-learnのクリーンインストールを備えたanaconda仮想環境を使用していました。これは次のように設定されています(バージョン0.16.1の場合)。

conda create -n new_sklearn python=3.4
source activate new_sklearn
conda install sklearn
Bug

最も参考になるコメント

これは、データの形状に問題がある可能性があります。
あなたのX 1ndimですか2ndimですか?
0.15と0.16の間で意図しない動作の変化が生じる可能性がありますが、将来的には1ndim入力をサポートしないことにしたので、入力形状はX.shape = (n_samples, 1)必要があります。
できるよ

X = X.reshape(-1, 1)

それ以外の場合、1つのサンプルまたは1つの機能を意味する場合は、多少あいまいです。

全てのコメント4件

これは、データの形状に問題がある可能性があります。
あなたのX 1ndimですか2ndimですか?
0.15と0.16の間で意図しない動作の変化が生じる可能性がありますが、将来的には1ndim入力をサポートしないことにしたので、入力形状はX.shape = (n_samples, 1)必要があります。
できるよ

X = X.reshape(-1, 1)

それ以外の場合、1つのサンプルまたは1つの機能を意味する場合は、多少あいまいです。

はい、入力データの形状を変更すると、正常に機能します。 ありがとうございました!

こんにちは、上記のコードはエラーを修正しますが、動作は異なると思います。 このチュートリアルコードを実行し

同じ結果が得られるように変更できるもの(パラメーターなど)はありますか? ありがとう!

@imadie

参照されているチュートリアルでは、次の行を次のように変更します。

clf = GMM(4、n_iter = 500、random_state = 3)
x.shape =(x.shape [0]、1)
clf = clf.fit(x)

xpdf = np.linspace(-10、20、1000)
xpdf.shape =(xpdf.shape [0]、1)
密度= np.exp(clf.score(xpdf))

このページは役に立ちましたか?
0 / 5 - 0 評価