アクサンの場合

Python3初心者が段々上達するログ

sklearn 0.18.1 でのKL-Divergence of two GMMs

KLダイバージェンスを2つのGMMで求めたいとき

過去に,

python - KL-Divergence of two GMMs - Stack Overflow

があった. そこから引用すると,

def gmm_kl(gmm_p, gmm_q, n_samples=10**5):
    X = gmm_p.sample(n_samples)
    log_p_X, _ = gmm_p.score_samples(X)
    log_q_X, _ = gmm_q.score_samples(X)
    return log_p_X.mean() - log_q_X.mean()

となる. しかしこれは古いsklearnの書き方.今は違う.

0.18.1でのKLダイバージェンス of two GMMs

def gmm_kl(gmm_p, gmm_q, n_samples=10**5):
    X, _ = gmm_p.sample(n_samples)
    log_p_X = gmm_p.score_samples(X)
    log_q_X = gmm_q.score_samples(X)
    return log_p_X.mean() - log_q_X.mean()

というのも,

GMM.sample(n_samples)はX(値)とy(混合ラベル)を返すように変わった. そして, GMM.score_samples(X)は2つ目の引数(今はlog probだけ)を返さなくなった.

ドキュメントはこちら

sklearn.mixture.GaussianMixture — scikit-learn 0.18.1 documentation