3

Python でsklearn.mixture.GMMを使用していますが、結果はデー​​タのスケーリングに依存しているようです。次のコード例では、全体のスケーリングを変更しますが、寸法の相対的なスケーリングは変更しません。それでも、3 つの異なるスケーリング設定では、まったく異なる結果が得られます。

from sklearn.mixture import GMM
from numpy import array, shape
from numpy.random import randn
from random import choice

# centroids will be normally-distributed around zero:
truelumps = randn(20, 5) * 10

# data randomly sampled from the centroids:
data = array([choice(truelumps) + randn(5) for _ in xrange(1000)])

for scaler in [0.01, 1, 100]:
    scdata = data * scaler
    thegmm = GMM(n_components=10)
    thegmm.fit(scdata, n_iter=1000)
    ll = thegmm.score(scdata)
    print sum(ll)

これが私が得る出力です:

GMM(cvtype='diag', n_components=10)
7094.87886779
GMM(cvtype='diag', n_components=10)
-14681.566456
GMM(cvtype='diag', n_components=10)
-37576.4496656

原則として、全体的なデータのスケーリングは重要ではなく、対数尤度の合計は毎回同様になるはずです。しかし、私が見落としている実装上の問題があるのではないでしょうか?

4

2 に答える 2

4

scikit-learnメーリングリストを介して回答がありました。私のコード例では、対数尤度は、に関連する要因によって、スケールによって実際に変化するはずlog(scale)です(積分ではなく、点の尤度を評価しているため) 。したがって、私のコード例は、実際にはGMMが正しい結果を提供していることを示していると思います。

于 2012-10-31T18:28:36.543 に答える
2

GMMはスケールに依存すると思います(たとえば、k-meansのように)。したがって、ドキュメントの前処理の章で説明されているように、入力を標準化することをお勧めします。

于 2012-10-31T16:27:49.790 に答える