gpt4 book ai didi

python - 两个 GMM 的 KL-Divergence

转载 作者:太空狗 更新时间:2023-10-30 00:27:59 27 4
gpt4 key购买 nike

我有两个 GMM,用于在同一空间中拟合两组不同的数据,我想计算它们之间的 KL 散度。

目前我正在使用 sklearn ( http://scikit-learn.org/stable/modules/generated/sklearn.mixture.GMM.html ) 中定义的 GMM 和 KL-divergence ( http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.stats.entropy.html ) 的 SciPy 实现

我该怎么做呢?我是否只想创建大量随机点,获取它们在两个模型(称为 P 和 Q)中的每一个上的概率,然后将这些概率用作我的输入?或者在 SciPy/SKLearn 环境中是否有一些更规范的方法来做到这一点?

最佳答案

GMM 之间的 KL 散度没有封闭形式。不过,您可以轻松地进行蒙特卡罗。回想一下 KL(p||q) =\int p(x) log(p(x)/q(x)) dx = E_p[ log(p(x)/q(x))。所以:

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

(均值(log(p(x)/q(x))) = mean(log(p(x)) - log(q(x))) = mean(log(p(x) )) - mean(log(q(x))) 在计算上更便宜。)

你不想使用scipy.stats.entropy;这适用于离散分布。

如果你想要对称和平滑的 Jensen-Shannon divergence KL(p||(p+q)/2) + KL(q||(p+q)/2) 相反,它非常相似:

def gmm_js(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)
log_mix_X = np.logaddexp(log_p_X, log_q_X)

Y = gmm_q.sample(n_samples)
log_p_Y, _ = gmm_p.score_samples(Y)
log_q_Y, _ = gmm_q.score_samples(Y)
log_mix_Y = np.logaddexp(log_p_Y, log_q_Y)

return (log_p_X.mean() - (log_mix_X.mean() - np.log(2))
+ log_q_Y.mean() - (log_mix_Y.mean() - np.log(2))) / 2

(log_mix_X/log_mix_Y 实际上是混合密度两倍的对数;将其从均值运算中提取出来可以节省一些失败。)

关于python - 两个 GMM 的 KL-Divergence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26079881/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com