KL Divergence
KL( Kullback–Leibler) Divergence中文译作KL散度,从信息论角度来讲,这个指标就是信息增益(Information Gain)或相对熵(Relative Entropy),用于衡量一个分布相对于另一个分布的差异性,注意,这个指标不能用作距离衡量,因为该指标不具有对称性,即两个分布PP和QQ,DKL(P|Q)DKL(P|Q)与DKL(Q|P)DKL(Q|P)计算的值一般不相等,若用作距离度量,一般需要对公式加以修改,后文讲到。
KL Divergence的计算公式为
对于离散分布
DKL(P|Q)=∑iP(i)logP(i)Q(i)
DKL(P|Q)=∑iP(i)log⁡P(i)Q(i)

对于连续分布
DKL(P|Q)=∫∞−∞p(x)logp(x)q(x)dx
DKL(P|Q)=∫−∞∞p(x)log⁡p(x)q(x)dx
程序
利用python 3计算:

import numpy as np
import scipy.stats# 随机生成两个离散型分布
x = [np.random.randint(1, 11) for i in range(10)]
print(x)
print(np.sum(x))
px = x / np.sum(x)
print(px)
y = [np.random.randint(1, 11) for i in range(10)]
print(y)
print(np.sum(y))
py = y / np.sum(y)
print(py)# 利用scipy API进行计算
# scipy计算函数可以处理非归一化情况,因此这里使用
# scipy.stats.entropy(x, y)或scipy.stats.entropy(px, py)均可
KL = scipy.stats.entropy(x, y)
print(KL)# 编程实现
KL = 0.0
for i in range(10):KL += px[i] * np.log(px[i] / py[i])
# print(str(px[i]) + ' ' + str(py[i]) + ' ' + str(px[i] * np.log(px[i] / py[i])))print(KL)

论文《Detecting Regions of Maximal Divergence for Spatio-Temporal Anomaly Detection》时,文中提到了这三种方法来比较时间序列中不同区域概率分布的差异。

KL散度、JS散度和交叉熵

三者都是用来衡量两个概率分布之间的差异性的指标。不同之处在于它们的数学表达。

对于概率分布P(x)和Q(x)

1)KL散度(Kullback–Leibler divergence)

又称KL距离,相对熵。

当P(x)和Q(x)的相似度越高,KL散度越小。

KL散度主要有两个性质:

(1)不对称性

尽管KL散度从直观上是个度量或距离函数,但它并不是一个真正的度量或者距离,因为它不具有对称性,即D(P||Q)!=D(Q||P)。

(2)非负性

相对熵的值是非负值,即D(P||Q)>0。

2)JS散度(Jensen-Shannon divergence)

JS散度也称JS距离,是KL散度的一种变形。

但是不同于KL主要又两方面:

(1)值域范围

JS散度的值域范围是[0,1],相同则是0,相反为1。相较于KL,对相似度的判别更确切了。

(2)对称性

即 JS(P||Q)=JS(Q||P),从数学表达式中就可以看出。

3)交叉熵(Cross Entropy)

在神经网络中,交叉熵可以作为损失函数,因为它可以衡量P和Q的相似性。

交叉熵和相对熵的关系:

以上都是基于离散分布的概率,如果是连续的数据,则需要对数据进行Probability Density Estimate来确定数据的概率分布,就不是求和而是通过求积分的形式进行计算了。

个人理解:

1、KL散度本质是用来衡量两个概率分布的差异一种数学计算方式;由于用到比值除法不具备对称性;

2、神经网络训练时为何不用KL散度,从数学上来讲,它们的差异在于KL散度多减了一个 H(P);P代表真实分布,Q代表估计的分布

从损失函数角度来看,在训练样本固定的情况下,H(P)是个常数,对梯度更新没有价值;所以两者的最优解是一样的;

KL散度的含义和性质:

在概率论或信息论中,KL散度( Kullback–Leibler divergence),又称相对熵(relative entropy),是描述两个概率分布P和Q差异的一种方法。它是非对称的,这意味着D(P||Q) ≠ D(Q||P)。特别的,在信息论中,D(P||Q)表示当用概率分布Q来拟合真实分布P时,产生的信息损耗,其中P表示真实分布,Q表示P的拟合分布。有人将KL散度称为KL距离,但事实上,KL散度并不满足距离的概念,应为:1)KL散度不是对称的;2)KL散度不满足三角不等式。对一个离散随机变量或连续的随机变量的两个概率分布P和Q来说,KL散度的定义分别如下所示。

KL散度在信息论中有自己明确的物理意义,它是用来度量使用基于Q分布的编码来编码来自P分布的样本平均所需的额外的Bit个数。而其在机器学习领域的物理意义则是用来度量两个函数的相似程度或者相近程度,在泛函分析中也被频繁地用到[2]。在香农信息论中,用基于P的编码去编码来自P的样本,其最优编码平均所需要的比特个数(即这个字符集的熵)为:

用基于P的编码去编码来自Q的样本,则所需要的比特个数变为:

于是,我们即可得出P与Q的KL散度

可以利用Jensen不等式证明P与Q之间的KL散度不小于0:

参考资料:[1] KL散度的解释,https://baike.so.com/doc/4949446-5170752.html.

[2] KL散度与Jensen不等式的理解,https://zhuanlan.zhihu.com/p/28249050.

kl散度学习笔记python实现相关推荐

  1. pytorch kl散度学习笔记

    KL散度,也叫做相对熵,计算公式如下: import torch.nn as nn import torch import torch.nn.functional as F if __name__ = ...

  2. python语言的33个保留字的基本含义_Python学习笔记——Python的33个保留字及其意义,python,pythone33,含义...

    Python学习笔记--Python的33个保留字及其意义,python,pythone33,含义 发表时间:2020-03-27 笔记走起 正文 序号 保留字 含义 1 and 用于表达式运算,逻辑 ...

  3. Python学习笔记--Python字符串连接方法总结

    声明: 这些总结的学习笔记,一部分是自己在工作学习中总结,一部分是收集网络中的知识点总结而成的,但不到原文链接.如果有侵权,请知会,多谢. python中有很多字符串连接方式,总结一下: 1)最原始的 ...

  4. 树莓派学习笔记——Python SQLite插入温度记录

    0 前言 本文使用python向SQLite数据库中插入树莓派温度数据,SQLite数据库中包含一张只包含三个字段的记录表--参数名称,时间和温度值.本文重点解释Python操作SQlite的具体方法 ...

  5. 【机器学习】信息论基础(联合熵、条件熵、交叉熵、KL散度等)+ Python代码实现

    文章目录 一.基本概念 1.1 联合熵 1.2 条件熵 1.3 交叉熵 1.3.1 Python编程实现交叉熵计算 1.4相对熵(KL散度) 1.4.1 Python编程实现KL散度计算 二.自信息和 ...

  6. 全志H616学习笔记------Python

    要求:不用深究,用C语言的视角学习,会改就行 Python是一种动态解释型语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在java..NET开发平台上使用. 特点 ...

  7. pytorch KL散度学习

    pytorch官方文档中给出了说明 下面是在学习过程中需要注意的: KL散度,也叫做相对熵,计算公式如下: KL(p∣∣q)=∑P(x)log(P(X)Q(x))KL(p||q) =\sum{P(x) ...

  8. 学习笔记:Python 面试100讲(基于Python3.x)05-python综合题

    01-read.readline.readlines区别 一 如何打开和读取文本内容 二 使用open函数打开文件,并返回一个IO对象,该对象有3个用于读取文件的方法, 分别为read.readlin ...

  9. python编程语法-Python学习笔记(Ⅰ)——Python程序结构与基础语法

    作为微软的粉丝,最后终于向Python低头了,拖了两三个月终于下定决心学习Python了.不过由于之前受到C/C#等语言影响的思维定式,前期有些东西理解起来还是很费了些功夫的. 零.先抄书: 1.Py ...

最新文章

  1. css3 奇技淫巧 - 如何给小汽车换个背景色谈起
  2. 数据中心2022:绿色的下一步是智能化
  3. 卡顿严重_王者峡谷:S20出现bug?卡顿十分严重
  4. Linux共享内存(二)
  5. linux 全局搜索文件_Linux笔记之文件搜索1
  6. Mysql limit 子查询
  7. python火狐配置文件_Python+Selenium中级篇之4-封装一个自己的类-浏览器引擎类/Python读取配置文件内容...
  8. Java中volatile的作用以及用法
  9. python创建字符串_Python基础之字符串
  10. win10下安装Cygwin配置gcc编译环境
  11. 改变定时器获取传感器频度_一文读懂传感器原理、作用及技术特点
  12. java飞机大战游戏
  13. 中国大陆收货地址智能解析API
  14. 年仅30岁!腾讯游戏程序员毛星云意外身故。。。
  15. ThinkPHP6校园疫情防控管理系统
  16. Mysql 当前月每天累计统计,Mysql 本月第一天
  17. 手游虚拟机服务器,手游大话西游虚拟机镜像一键服务端+配套客户端+启动教程+GM后台...
  18. 笔试题————一套实用的渗透测试岗位面试题
  19. 使用cmd安装python的matplotlib库
  20. burp suite爆破模式操作心得

热门文章

  1. Win32 API之Setlocale函数配置地域化信息函数
  2. Linux C编程--进程介绍6--进程的各种标识
  3. 数据结构--二叉树的创建和相关操作
  4. oracle更新快捷方式的错误,oracle 11g数据库启动错误总结
  5. php截取剩余部分,PHP从字串中截取一部分,支持使用(*)模糊截取
  6. 用python写一个简单的爬虫_Python实现简易Web爬虫详解
  7. 线转hdmi为什么检测不到_为什么苹果MacBook这么保值?
  8. php配置设置,PHP设置配置文件的方法
  9. 节省磁盘空间的新一代包管理工具PNPM
  10. 如何快速分辨一个男人是不是程序员