Scikit-learn: Algoritma EM di GMM gagal untuk kumpulan data satu dimensi menggunakan 0.16.1 (tapi baik-baik saja dengan 0.15.2)

Dibuat pada 13 Mei 2015  ·  4Komentar  ·  Sumber: scikit-learn/scikit-learn

Memasang distribusi gaussian satu dimensi menggunakan GMM.fit() menghasilkan kesalahan Runtime menggunakan scikit-learn versi 0.16.1, tetapi menghasilkan parameter yang sesuai menggunakan 0.15.2.

Contoh singkat untuk menunjukkan masalah:

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_)

Menjalankan kode contoh ini dengan scikit-learn 0.15.2 menghasilkan keluaran yang benar:

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

Namun, kode yang sama persis menggunakan scikit-learn 0.16.1 memberikan traceback ini:

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.

Saya telah mencoba berbagai nilai parameter n_init, n_iter dan covariance_type yang berbeda. Saya juga telah mencoba berbagai kumpulan data yang berbeda. Semua ini menghasilkan kesalahan ini atau serupa menggunakan 0.16.1, tetapi tidak ada masalah sama sekali menggunakan 0.15.2. Masalahnya tampaknya terkait dengan parameter awal yang digunakan dalam maksimalisasi harapan, jadi mungkin ini terkait dengan masalah ini: #4429

Jika ini adalah info yang berguna, saya menggunakan lingkungan virtual anaconda dengan instalasi bersih scikit-learn, atur sebagai berikut (untuk versi 0.16.1):

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

Komentar yang paling membantu

Ini mungkin masalah dengan bentuk data.
Apakah X 1 ndim atau 2 ndim?
Mungkin ada perubahan perilaku yang tidak disengaja antara 0,15 dan 0,16, tetapi saya pikir kami memutuskan bahwa di masa mendatang, kami tidak akan mendukung input 1ndim, jadi bentuk input Anda harus X.shape = (n_samples, 1) .
Anda dapat melakukan

X = X.reshape(-1, 1)

Kalau tidak, agak ambigu jika yang Anda maksud adalah satu sampel atau satu fitur.

Semua 4 komentar

Ini mungkin masalah dengan bentuk data.
Apakah X 1 ndim atau 2 ndim?
Mungkin ada perubahan perilaku yang tidak disengaja antara 0,15 dan 0,16, tetapi saya pikir kami memutuskan bahwa di masa mendatang, kami tidak akan mendukung input 1ndim, jadi bentuk input Anda harus X.shape = (n_samples, 1) .
Anda dapat melakukan

X = X.reshape(-1, 1)

Kalau tidak, agak ambigu jika yang Anda maksud adalah satu sampel atau satu fitur.

Ya, setelah saya membentuk kembali data input, itu berfungsi dengan baik. Terima kasih!

Hai, kode di atas memperbaiki kesalahan, tetapi menurut saya perilakunya berbeda. Saya menjalankan kode tutorial ini tetapi setelah saya membentuk kembali data input, saya tidak dapat mereproduksi plot.

Apakah ada sesuatu yang dapat saya ubah (parameter, mungkin) sehingga saya dapat memperoleh hasil yang sama? Terima kasih!

@imadie

dalam tutorial yang dirujuk, ubah baris berikut menjadi:

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

xpdf = np.linspace(-10, 20, 1000)
xpdf.bentuk = (xpdf.bentuk[0],1)
kepadatan = np.exp(clf.score(xpdf))

Apakah halaman ini membantu?
0 / 5 - 0 peringkat