KL散度及Python实现

  • 1 KL散度
    • 1.1 定义
    • 1.2 公式
    • 1.3 几个结论
    • 1.4 应用
      • 1.4.1 应用1:机器学习领域
      • 1.4.2 应用2:用户画像
  • 2 Python实现求解
    • 2.1 生成分布
    • 2.2 计算方法1
    • 2.3 计算方法2
  • 3 参考

1 KL散度

在很多场合,经常会遇到KL散度这个概念,那么它到底是什么含义呢?如何定义的?又有哪些应用场景?最后如何用Python进行计算呢?

1.1 定义

KL散度(Kullback-Leibler divergence,简称KLD):

  • 在信息系统中称为相对熵(relative entropy)
  • 在连续时间序列中称为随机性(randomness)
  • 在统计模型推断中称为信息增益(information gain)。也称信息散度(information divergence)。

KL散度是用于衡量分布P相对于分布Q的差异性。典型情况下,P表示数据的真实分布,Q表示数据的理论分布、估计的模型分布、或P的近似分布

注:这个指标不能用作距离衡量,因为该指标不具有对称性,DKL(P|Q) ≠ DKL(Q|P)

1.2 公式

离散分布:

DKL(P∣Q)=∑iP(i)log⁡P(i)Q(i)D_{KL}(P|Q)=\sum\limits_i P(i)\log \frac{P(i)}{Q(i)}DKL​(P∣Q)=i∑​P(i)logQ(i)P(i)​

连续分布:

DKL(P∣Q)=∫−∞∞p(x)log⁡p(x)q(x)dxD_{KL}(P|Q)=\int_{-\infty}^{\infty}p(x)\log\frac{p(x)}{q(x)}dxDKL​(P∣Q)=∫−∞∞​p(x)logq(x)p(x)​dx

1.3 几个结论

  • KL散度是大于等于0的,所以可以作为衡量两个分布之间不相似程度的度量,越小越相似,越大越不相似。
  • 最小化KL等价于最大化似然函数

1.4 应用

1.4.1 应用1:机器学习领域

机器学习领域中的生成模型往往涉及到生成尽可能反映真实情况的分布模型

比如,生成对抗网络(GAN)在图片上的应用往往执行的是类似基于黑白图片生成看起来尽量真实的彩色图片这样的任务。在这类似的应用中,输入往往是图像或像素。网络会学习这些像素之间的依赖关系(比如临近像素通常有相似的颜色),然后使用它来创建看起来尽量真实的图像。因此,生成器的目标就是最小化所学到的像素分布于真实图像像素分布之间的散度

1.4.2 应用2:用户画像

比如电商场景,可以使用KL散度去计算同一类型商品不同用户群体之间的金额(或其余指标)KL散度,如果都很接近,说明这个类型商品不是不同用户群体之间的差异点,可以进行剔除,只保留有差异性的商品类型(KL散度较大),这样就可以基于结果去对用户进行更好的画像~

2 Python实现求解

2.1 生成分布

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)
[9, 3, 10, 5, 10, 4, 7, 6, 8, 1]
63
[0.14285714 0.04761905 0.15873016 0.07936508 0.15873016 0.063492060.11111111 0.0952381  0.12698413 0.01587302]
[6, 5, 10, 1, 7, 9, 9, 6, 2, 8]
63
[0.0952381  0.07936508 0.15873016 0.01587302 0.11111111 0.142857140.14285714 0.0952381  0.03174603 0.12698413]

2.2 计算方法1

# 利用scipy API进行计算
# scipy计算函数可以处理非归一化情况,因此这里使用
# scipy.stats.entropy(x, y)或scipy.stats.entropy(px, py)均可
'''
用函数entropy用x和y 或者 px, py 都可以
'''
KL = scipy.stats.entropy(px, py)
print(KL)KL = scipy.stats.entropy(x, y)
print(KL)
0.2815657077409675
0.2815657077409676

2.3 计算方法2

# 编程实现
'''
用公式编程就用px和py
'''
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)
0.2815657077409677

验证对称性不成立:

KL = scipy.stats.entropy(y, x)
print(KL)
0.3085447676484088

确实和上述0.28不一致~

3 参考

  • https://blog.csdn.net/jacke121/article/details/107852096
  • https://www.jianshu.com/p/43318a3dc715
  • https://zhuanlan.zhihu.com/p/39682125
  • https://zh.wikipedia.org/wiki/%E7%9B%B8%E5%AF%B9%E7%86%B5
  • 应用参考:https://www.cnblogs.com/charlotte77/p/5392052.html
  • 应用参考2:https://blog.csdn.net/june_young_fan/article/details/114935283

KL散度及Python实现相关推荐

  1. kl散度学习笔记python实现

    KL Divergence KL( Kullback–Leibler) Divergence中文译作KL散度,从信息论角度来讲,这个指标就是信息增益(Information Gain)或相对熵(Rel ...

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

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

  3. python计算矩阵的散度_python 3计算KL散度(KL Divergence)

    KL Divergence KL( Kullback–Leibler) Divergence中文译作KL散度,从信息论角度来讲,这个指标就是信息增益(Information Gain)或相对熵(Rel ...

  4. KL/JS散度及Python实现

    1. KL散度与JS散度的公式与代码的简要实现 import numpy as np import scipy.stats as ss np.random.seed(42)# 随机生成:两个离散分布 ...

  5. 距离度量:欧氏距离,余弦距离,KL散度,马氏距离(含python代码实现)

    1. 欧氏距离(Euclidean Distance) 欧氏距离,又称欧几里得度量,绝对距离, 是欧几里得空间中两点间"普通"(即直线)距离. 定义如下: 2. 余弦距离(余弦相似 ...

  6. 为什么交叉熵和KL散度在作为损失函数时是近似相等的

    来源:DeepHub IMBA 本文约900字,建议阅读5分钟 在本文中,我们将介绍熵.交叉熵和 Kullback-Leibler Divergence [2] 的概念,并了解如何将它们近似为相等. ...

  7. 【项目实战课】基于ncnn框架与KL散度的8bit对称模型量化与推理实战

    欢迎大家来到我们的项目实战课,本期内容是<基于ncnn框架与KL散度的8bit对称模型量化与推理实战>. 所谓项目实战课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题, ...

  8. kl散度定义_Kullback-Leibler(KL)散度介绍

    在这篇文章中,我们将探讨一种比较两个概率分布的方法,称为Kullback-Leibler散度(通常简称为KL散度).通常在概率和统计中,我们会用更简单的近似分布来代替观察到的数据或复杂的分布.KL散度 ...

  9. kl散度度量分布_数据挖掘比赛技巧——确定数据同分布

    在数据挖掘比赛中,很重要的一个技巧就是要确定训练集与测试集特征是否同分布,这也是机器学习的一个很重要的假设[1].但很多时候我们知道这个道理,却很难有方法来保证数据同分布,这篇文章就分享一下我所了解的 ...

最新文章

  1. 一道关于call和this的JS面试题
  2. 人际关系和谐交际的10个“音符”
  3. 使用CAShapeLayer实现一个音量大小动态改变的控件
  4. oracle创建表语句_利用FME去拼接SQL语句并创建表
  5. VS 2005 文本编码小技巧 --中文亂碼問題解決
  6. GridView+ZedGraph【转】
  7. python爬取ajax动态内容肯德基门店,Python爬虫如何爬取KFC地址
  8. 档案盒正面标签制作_错题本科学制作方法、正确使用方式及窍门
  9. Oracle中获取文件中的数据,操作oracle中的数据文件
  10. discuz php mysql_php下mysql数据库操作类(改自discuz)
  11. Django-admin源码流程
  12. 用.NET编程风格实现Ajax——Atlas快速入门
  13. linux下查看设备的接口,linux 查看sdio接口有哪些设备?
  14. 直方图均衡化及算法步骤
  15. 使用百度地图时,经纬度坐标正确,但位置只显示北京
  16. 删除电脑桌面的IE(Internet Explorer)浏览器图标
  17. 在网址前加神秘字母,让你打开新世界
  18. 利用python画圆
  19. Unity—手机端的触屏控制
  20. 该换壁纸啦,记录一个用CSS和HTML做的3D立体相册

热门文章

  1. 工作两年自我介绍程序员,不愧是大佬
  2. 总结 HTTPS 的加密流程
  3. 网络编程_UDP socket
  4. 人类能控制AI狙击手的准星吗?
  5. go-go test 单元测试
  6. 程序员如何祝福圣诞节快乐?你没试过这种吧?
  7. 【SaaS-Export项目】 - 系统架构介绍,SaaS介绍,Export系统介绍
  8. js添加多个子节点_js添加和删除节点, 方法调用是通过子节点中的节点来添加的呢。...
  9. Linux环境搭建记录——Jenkins安装
  10. 自带手机GPS - 百度gps