我有两个GARCH,我用它来拟合同一空间中的两组不同的数据,我想计算它们之间的KL散度。
目前,我正在使用sklearn(http://scikit-learn.org/stable/modules/generated/sklearn.mixture.GMM.html)中定义的GSTIM和KL-发散(http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.stats.entropy.html)的SciPy实现。
我该怎么做呢?我想创建大量的随机点,得到它们在两个模型(称为P和Q)上的概率,然后使用这些概率作为我的输入吗?或者在SciPy/SKLearn环境中有没有更规范的方法来做到这一点?
2条答案
按热度按时间flvtvl501#
没有封闭的形式的KL分歧之间的甘精胰岛素。你可以很容易地做蒙特卡洛。记住
KL(p||q) = \int p(x) log(p(x) / q(x)) dx = E_p[ log(p(x) / 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)
,它非常相似:(
log_mix_X
/log_mix_Y
实际上是混合物密度的两倍的对数;把它从平均操作中拉出来可以节省一些失败。)hrysbysz2#
Danica的回答逻辑正确。我尝试了sklearn 1.3.0,但结果不可靠(特别是评分功能)。所以我写的代码的帮助下ChatGPT计算KL。