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-learn 0.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을 μƒˆλ‘œ μ„€μΉ˜ν•œ μ•„λ‚˜μ½˜λ‹€ 가상 ν™˜κ²½μ„ λ‹€μŒκ³Ό 같이 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€(버전 0.16.1용).

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

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ΄λŠ” 데이터 ν˜•νƒœμ— λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
X 1ndimμž…λ‹ˆκΉŒ μ•„λ‹ˆλ©΄ 2ndimμž…λ‹ˆκΉŒ?
0.15와 0.16 사이에 μ˜λ„ν•˜μ§€ μ•Šμ€ λ™μž‘ 변경이 μžˆμ„ 수 μžˆμ§€λ§Œ μ•žμœΌλ‘œ 1ndim μž…λ ₯을 μ§€μ›ν•˜μ§€ μ•ŠκΈ°λ‘œ κ²°μ •ν–ˆκΈ° λ•Œλ¬Έμ— μž…λ ₯ λͺ¨μ–‘은 X.shape = (n_samples, 1) 이어야 ν•©λ‹ˆλ‹€.
λ„Œ ν•  μˆ˜μžˆμ–΄

X = X.reshape(-1, 1)

그렇지 μ•ŠμœΌλ©΄ ν•˜λ‚˜μ˜ μƒ˜ν”Œ λ˜λŠ” ν•˜λ‚˜μ˜ κΈ°λŠ₯을 μ˜λ―Έν•˜λŠ” 경우 λ‹€μ†Œ λͺ¨ν˜Έν•©λ‹ˆλ‹€.

λͺ¨λ“  4 λŒ“κΈ€

μ΄λŠ” 데이터 ν˜•νƒœμ— λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
X 1ndimμž…λ‹ˆκΉŒ μ•„λ‹ˆλ©΄ 2ndimμž…λ‹ˆκΉŒ?
0.15와 0.16 사이에 μ˜λ„ν•˜μ§€ μ•Šμ€ λ™μž‘ 변경이 μžˆμ„ 수 μžˆμ§€λ§Œ μ•žμœΌλ‘œ 1ndim μž…λ ₯을 μ§€μ›ν•˜μ§€ μ•ŠκΈ°λ‘œ κ²°μ •ν–ˆκΈ° λ•Œλ¬Έμ— μž…λ ₯ λͺ¨μ–‘은 X.shape = (n_samples, 1) 이어야 ν•©λ‹ˆλ‹€.
λ„Œ ν•  μˆ˜μžˆμ–΄

X = X.reshape(-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 λ“±κΈ‰