1. 统计距离 (Statistical Distance)

很多时候我们需要对比两个概率分布: 我们有一个随机变量和它的两个不同的概率分布 (P 与 Q), 比如一个真实的分布和一个模型估计的分布. 这种情况下, 我们需要对分布之间的差异进行量化, 这种量化就是计算两个统计对象(如概率分布)之间的统计距离.

一种方式是计算两个分布之间的距离 distance, 但这很难且无法解释. 另一种方法更通用, 即计算两个分布之间的散度 divergence.

Divergence 是一种度量但却不对称, 可以理解为 divergence 表示对 P 与 Q 的差异程度的评分 (a scoring of how P differs from Q), 且 P 和 Q 的 divergence 与 Q 和 P 的 divergence 值不同.

Divergence 是信息论中许多计算的基础, 也是机器学习中很多计算的基础. 比如 mutual information (information gain) 和 cross-entropy 都是用作分类模型的损失函数.

信息论中常用的两个 divergence 是 KL divergence (Kullback-Leibler divergence) 和 JS divergence (Jensen-Shannon divergence).

2. KL 散度 (KL Divergence)

2.1 介绍

KL divergence 也称为 relative entropy, 度量了一个概率分布不同与另一个概率分布的程度(difference/ dissimilarity), 两个分布 P 和 Q 的 KL divergence 的计算公式为 (随机变量X为离散时):

sum 中的值是每个事件的 divergence.

当 P 中的一个事件的概率很大, 但 Q 中相同事件的概率很小时, 此时的 divergence 很大. 当 P 的概率很小, 而 Q 的概率很大时, divergence 也很大, 但没有上一种情况那么大. 所以需要注意:

KL divergence 也可用于测量连续随机变量的分布之间的差异, 此时将上述公式中的 sum 符号换为 integral 符号.

其中 log 可以以 2 为底, 以 bits 为单位; 也可以自然对数 e 为底, 以 nats 为单位. 当 KL divergence 等于 0 时, 表示两个分布相同, 否则为正数. 如果我们想要逼近一个目标概率分布 P, 我们模型的输出的分布为Q, 这时的 KL divergence (以2为底) 计算的是表达随机变量中事件所需的额外 bits. 我们的近似越好, 所需的额外信息就越少.

2.2 python 实例

考虑一个随机变量 X, 它的三个事件为 X 等于三个不同的颜色. 对于 X,我们有两种不同的概率分布 P 和 Q:

# define distributions
events = ['red', 'green', 'blue']
p = [0.10, 0.40, 0.50]
q = [0.80, 0.15, 0.05]

可以将这些概率可视化以便进行比对:

# plot of distributions
from matplotlib import pyplot
print('P=%.3f Q=%.3f' % (sum(p), sum(q)))
# plot first distribution
pyplot.subplot(2,1,1)
pyplot.bar(events, p)
# plot second distribution
pyplot.subplot(2,1,2)
pyplot.bar(events, q)
# show the plot
pyplot.show()

定义一个计算 KL divergence (以 2 为底) 的方法, 并使用这个方法计算 P 与 Q, Q 与 P 的 KL divergence:

from math import log2
def kl_divergence(p, q):return sum(p[i] * log2(p[i]/q[i]) for i in range(len(p)))
# calculate (P || Q)
kl_pq = kl_divergence(p, q)
print('KL(P || Q): %.3f bits' % kl_pq)
# calculate (Q || P)
kl_qp = kl_divergence(q, p)
print('KL(Q || P): %.3f bits' % kl_qp)

结果为:

KL(P || Q): 1.927 bits

KL(Q || P): 2.002 bits

若将方法种的 log2() 换为自然对数 log(), 结果为:

KL(P || Q): 1.336 nats

KL(Q || P): 1.401 nats

SciPy 库 提供了 kl_div() 和 rel_entr() 函数用于计算 KL divergence.

# example of calculating the kl divergence (relative entropy) with scipy
from scipy.special import rel_entr
# define distributions
p = [0.10, 0.40, 0.50]
q = [0.80, 0.15, 0.05]
# calculate (P || Q)
kl_pq = rel_entr(p, q)
print('KL(P || Q): %.3f nats' % sum(kl_pq))
# calculate (Q || P)
kl_qp = rel_entr(q, p)
print('KL(Q || P): %.3f nats' % sum(kl_qp))

KL(P || Q): 1.336 nats

KL(Q || P): 1.401 nats

运行结果与前面我们自己定义的以e为底的函数结果相同.

3. JS 散度 (JS Divergence)

3.1 介绍

Jensen-Shannon divergence 是另一种度量两个概率分布之间的差异的方法. JS divergence 以 KL divergence 为基础, 但它是对称的, 归一化的:

计算公式为:

其中,

当使用以2为底的 log 时, JS divergence 是一种 KL divergence 的平滑和归一化版本, 当值为 0 时, 表示"完全相同", 当值为 1 时, 表示"最不相同".

JS divergence 的均方根表示 Jensen-Shannon distance, 即 JS distance.

3.2 python 实例

首先定义一个 JS divergence 的方法(使用了前述的 kl_divergence() ):

from numpy import asarray
from math import log2# define distributions
p = asarray([0.10, 0.40, 0.50])
q = asarray([0.80, 0.15, 0.05])# calculate the kl divergence
def kl_divergence(p, q):return sum(p[i] * log2(p[i]/q[i]) for i in range(len(p)))# calculate the js divergence
def js_divergence(p, q):m = 0.5 * (p + q)return 0.5 * kl_divergence(p, m) + 0.5 * kl_divergence(q, m)

分别测试一下 JS divergence 和 JS distance:

from math import sqrt
# calculate JS(P || Q)
js_pq = js_divergence(p, q)
print('JS(P || Q) divergence: %.3f bits' % js_pq)
print('JS(P || Q) distance: %.3f' % sqrt(js_pq))# calculate JS(Q || P)
js_qp = js_divergence(q, p)
print('JS(Q || P) divergence: %.3f bits' % js_qp)
print('JS(Q || P) distance: %.3f' % sqrt(js_qp))

JS(P || Q) divergence: 0.420 bits

JS(P || Q) distance: 0.648

JS(Q || P) divergence: 0.420 bits

JS(Q || P) distance: 0.648

运行结果可以看出 JS divergence 和 JS distance 都是对称的.

同样地, SciPy 提供了 jensenshannon() 用于计算 JS distance:

# calculate the jensen-shannon distance metric
from scipy.spatial.distance import jensenshannon
from numpy import asarray
# define distributions
p = asarray([0.10, 0.40, 0.50])
q = asarray([0.80, 0.15, 0.05])
# calculate JS(P || Q)
js_pq = jensenshannon(p, q, base=2)
print('JS(P || Q) Distance: %.3f' % js_pq)
# calculate JS(Q || P)
js_qp = jensenshannon(q, p, base=2)
print('JS(Q || P) Distance: %.3f' % js_qp)

JS(P || Q) Distance: 0.648

JS(Q || P) Distance: 0.648

KL Divergence 与 JS Divergence相关推荐

  1. KL divergence,JS divergence,Wasserstein distance是什么

    文章目录 前言 KL divergence JS divergence Wasserstein distance 总结 前言 这三个东西都可以用来两个分布的差异.其中三最难,其本身是来自另外的领域,如 ...

  2. KL divergence JS divergence F divergence

    KL散度: 衡量两个概率分布之间差异的指标 又称kl距离 ,相对熵 D ( P ∥ Q ) = ∑ P ( x ) log ⁡ P ( x ) Q ( x ) \mathrm{D}(\mathrm{P ...

  3. 机器学习中的数学——距离定义(二十):相对熵(Relative Entropy)/KL散度(Kullback-Leibler Divergence)

    分类目录:<机器学习中的数学>总目录 相关文章: · 距离定义:基础知识 · 距离定义(一):欧几里得距离(Euclidean Distance) · 距离定义(二):曼哈顿距离(Manh ...

  4. 损失函数——KL散度(Kullback-Leibler Divergence,KL Divergence)

    KL散度(Kullback-Leibler Divergence,简称KL散度)是一种度量两个概率分布之间差异的指标,也被称为相对熵(Relative Entropy).KL散度被广泛应用于信息论.统 ...

  5. 【GANs学习笔记】(六)JS Divergence不是最好的Divergence

    完整笔记:http://www.gwylab.com/note-gans.html ----------------------- 3. JS divergence不是最佳的divergence 在第 ...

  6. 信息量、熵、交叉熵、KL散度、JS散度杂谈

    信息量.熵.交叉熵.KL散度.JS散度杂谈 信息量 任何事件都会承载着一定的信息量,包括已经发生的事件和未发生的事件,只是它们承载的信息量会有所不同.如昨天下雨这个已知事件,因为已经发生,既定事实,那 ...

  7. 信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离

    前两篇介绍了目标检测中的回归损失函数,本来这篇打算介绍目标检测中的分类损失函数.但是介绍classification loss function自然绕不过交叉熵,所以还是简单的把信息论中的一些概念在这 ...

  8. GANs之信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离

    信息量也叫做香农信息量,常用于刻画消除随机变量X在x处的不确定性所需的信息量大小.假设只考虑连续型随机变量的情况,设p为随机变量X的概率分布,即p(x)为随机变量X在X=x处的概率密度函数值,随机变量 ...

  9. 信息量、熵、交叉熵、KL散度、JS散度、Wasserstein距离

    信息量.熵.交叉熵.KL散度.JS散度 文章目录 信息量.熵.交叉熵.KL散度.JS散度 前言 一.信息量 二.熵 三.交叉熵 四.KL散度 五.JS散度 六. Wasserstein距离 1.解决的 ...

最新文章

  1. 如何在C#Windows控制台应用程序中更新当前行?
  2. Model层的两种写法
  3. 指数衰减学习率的意义与使用方法
  4. UV认证应用安全标准的目的
  5. 实战:网店活动付邮试用全攻略
  6. 浅谈MySQL的七种锁
  7. STM32的2.02固件库提供的启动文件详解 stm32f10x_vector.s
  8. 揭秘Facebook官方底层C++函数Folly
  9. IOS中延时执行的几种方式的比较和汇总
  10. Linux账号和权限管理
  11. web安全攻防渗透+赵雨佳43
  12. 视觉SLAM十四讲学习笔记——第十三讲 实践:设计SLAM系统
  13. 阿波罗无法通过链接外网
  14. Android高手笔记 - IO优化
  15. Final Cut Pro 10.4.7 全面支持的你GPU
  16. 华为折叠x2是鸿蒙系统吗,华为mateX2发布,鸿蒙系统四月上线,matex2首批搭载。...
  17. jQuery实现表单验证
  18. 送书 | 火遍日本 IT 界的「鱼书」终出续作!!!!
  19. 关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事
  20. 爱尔兰卫生部遭Conti勒索软件攻击说明与建议

热门文章

  1. ORA-01031:insufficient privileges 解决方法
  2. Xcode 打包到蒲公英
  3. Java——StringUtils
  4. SSO单点登录解决方案——Filter方式
  5. 需要系数 计算机房,计算电流及需要系数表.xls
  6. zurb是什么网站_Zurb的Tribute库的Vue.js包装器,用于本机@mentions
  7. 计算机管理恢复分区,windows10系统隐藏恢复分区Recovery Image的方法
  8. 前端进度报告(2018.6.3)
  9. Python--递归初步
  10. 电大计算机画图程序属性,电大计算机绘图(本)复习大全.doc