python - scipy 中用于计算相对熵的 3 个函数。有什么不同?
问题描述
python 中的 Scipy 提供了以下函数,这些函数似乎可以计算相同的信息论度量,即 Kullback-Leibler 散度,也称为相对熵:
scipy.stats.entropy
, 如果qk=None
scipy.special.rel_entr
scipy.special.kl_div
为什么三个是一样的?有人可以解释它们之间的区别吗?
解决方案
计算离散概率向量之间的 KL 散度的默认选项是scipy.stats.entropy
。
相反,两者scipy.special.rel_entr
和scipy.special.kl_div
都是“逐元素函数”,可以与通常的数组操作结合使用,并且必须在它们产生聚合相对熵值之前求和。
虽然两者都产生相同的总和(当与适当的概率向量一起使用时,其元素总和为 1),第二个变体 ( scipy.special.kl_div
) 在元素方面是不同的,因为它添加了 -x +y 项,即
(x log(x/y)) - x + y
在总和中抵消。
例如
from numpy import array
from scipy.stats import entropy
from scipy.special import rel_entr, kl_div
p = array([1/2, 1/2])
q = array([1/10, 9/10])
print(entropy(p, q))
print(rel_entr(p, q), sum(rel_entr(p, q)))
print(kl_div(p, q), sum(kl_div(p, q)))
产量
0.5108256237659907
[ 0.80471896 -0.29389333] 0.5108256237659907
[0.40471896 0.10610667] 0.5108256237659906
我不熟悉 element-wise extra-terms 背后的基本原理,scipy.special.kl_div
但文档指向可能解释更多的参考。
请参阅: https ://docs.scipy.org/doc/scipy/reference/generated/scipy.special.kl_div.html#scipy.special.kl_div
推荐阅读
- shell - 如何在 Ubuntu 中使用 ripgrep 搜索 CSV 文件中的行
- spring-boot - 调试器、@SpringBootTest 和 Gradle
- angular - 如何使用 Angular 在 mat-header-cell 行中呈现动态数据
- python - 未按下键时Python Curses addstr() 错误
- c# - foreach循环迭代中的列不属于数据表
- swift - 自定义警报显示在空窗口而不是以前的 viewController
- javascript - 当从父组件调用 setState 时,子组件不适用于 React
- java - DL4J 中的 MultiLayerSpace.Builder.layer() 和 MultiLayerSpace.Builder.addLayer() 有什么区别?
- reactjs - React Hooks ,函数 fetchData 不是反应组件?
- hive - 浮点列上的火花 sql 百分位数