背景

很多场景需要考虑数据分布的相似度/距离:比如确定一个正态分布是否能够很好的描述一个群体的身高(正态分布生成的样本分布应当与实际的抽样分布接近),或者一个分类算法是否能够很好地区分样本的特征(在两个分类下的数据分布的差异应当比较大)。

    (例子:上图来自 OpenAI的 Radford A , Jozefowicz R , Sutskever I . Learning to Generate Reviews and Discovering Sentiment[J]. 2017. 他们发现他们训练的深度神经网络中有一个单独的神经元就对正负情感的区分度相当良好。)

上图可以直接看出明显的分布区别,但是能够衡量这种分布的距离更便于多种方法间的比较。KL/JS散度就是常用的衡量数据概率分布的数值指标,可以看成是数据分布的一种“距离”,关于它们的理论基础可以在网上找到很多参考,这里只简要给出公式和性质,还有代码实现:

KL散度

有时也称为相对熵,KL距离。对于两个概率分布P、Q,二者越相似,KL散度越小。

  • KL散度满足非负性
  • KL散度是不对称的,交换P、Q的位置将得到不同结果。


python3代码:

import numpy as np
import scipy.stats
p=np.asarray([0.65,0.25,0.07,0.03])
q=np.array([0.6,0.25,0.1,0.05])
def KL_divergence(p,q):return scipy.stats.entropy(p, q, base=2)
print(KL_divergence(p,q)) # 0.01693110139988926
print(KL_divergence(q,p)) # 0.019019266539324498

JS散度

JS散度基于KL散度,同样是二者越相似,JS散度越小。

  • JS散度的取值范围在0-1之间,完全相同时为0
  • JS散度是对称的


python3代码:

import numpy as np
import scipy.stats
p=np.asarray([0.65,0.25,0.07,0.03])
q=np.array([0.6,0.25,0.1,0.05])
q2=np.array([0.1,0.2,0.3,0.4])
def JS_divergence(p,q):M=(p+q)/2return 0.5*scipy.stats.entropy(p, M, base=2)+0.5*scipy.stats.entropy(q, M, base=2)
print(JS_divergence(p,q))  # 0.004463665396105692
print(JS_divergence(p,q2)) # 0.35662209477833745
print(JS_divergence(p,p)) # 0.0

实例:身高分布预测比较

在实际运用中,我们往往并不是一开始就能得到概率分布的,我们手上的更多是像每个人的身高这样的具体数据,那么怎么在python把它们转化为概率分布然后衡量距离呢?
    我们需要把数据等间隔地切分成一些区间(也叫作桶bin),然后就可以把样本落在每个区间的概率作为分布。pandas提供了cut这个方便的函数可以完成这一点。
    下面我将演示一个身高分布预测比较的例子,用scipy的正态分布函数随机生成了真实的身高分布和两个预测,让我们用散度来评判哪个是更好的预测:
上代码:

from scipy.stats import norm
import pandas as pd
#1000个均值170,标准差10的正态分布身高样本
h_real = norm.rvs(loc=170, scale=10, size=1000)
h_predict1 = norm.rvs(loc=168, scale=9, size=1000)
h_predict2 = norm.rvs(loc=160, scale=20, size=1000)
def JS_div(arr1,arr2,num_bins):max0 = max(np.max(arr1),np.max(arr2))min0 = min(np.min(arr1),np.min(arr2))bins = np.linspace(min0-1e-4, max0-1e-4, num=num_bins)PDF1 = pd.cut(arr1,bins).value_counts() / len(arr1)PDF2 = pd.cut(arr2,bins).value_counts() / len(arr2)return JS_divergence(PDF1.values,PDF2.values)print(JS_div(h_real,h_predict1,num_bins=20))  # 0.0014
print(JS_div(h_real,h_predict2,num_bins=20))  # 0.1978

我为预测1设置的参数和真实值更加接近。而预测1的散度的确更低,说明它是更好的预测。

python衡量数据分布的相似度/距离(KL/JS散度)相关推荐

  1. KL/JS散度及Python实现

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

  2. GAN相关知识点 - 纳什均衡、模型崩塌、WGAN原理、EM 距离、JS 散度等

    GAN相关知识点 - 纳什均衡.模型崩塌.WGAN原理.EM 距离.JS 散度等 一.纳什均衡 二.GAN 训练难题 三.WGAN 原理 一.纳什均衡 现在我们从理论层面进行分析,通过博弈学习的训练方 ...

  3. 如何用python计算levenshteindistance_Levenshtein计算相似度距离

    使用Levenshtein计算相似度距离,装下模块,调用下函数就好. 拿idf还得自己去算权重,而且不一定准确度高,一般做idf还得做词性归一化,把动词形容词什么全部转成名词,很麻烦. Levensh ...

  4. 信息量-log2P(莫斯编码使用频繁P大的字符编码段信息量少)、信息熵:期望E=-Plog2P、两点分布交叉熵=KL散度=相对熵=-plnp-(1-p)ln(1-p)不对称、JS散度对称

    信息熵为什么要定义成-Σp*log§? 信息熵为什么要定义成-Σp*log(p)? 在解释信息熵之前,需要先来说说什么是信息量. 信息量是对信息的度量,单位一般用bit. 信息论之父克劳德·艾尔伍德· ...

  5. kl散度与js散度_数据集相似度度量之KLamp;JS散度

    一.KL散度 1.什么是KL散度 KL散度又叫相对熵,是描述两个概率分布差异的一种方法,有人将KL散度称为KL距离,但实际上它不满足距离概念中的两个条件,a.对称性,即D(P||Q)=D(Q||P); ...

  6. 02 聚类算法 - 相似度距离公式、维度灾难

    聚类就是对__大量未知标注__的数据集,按照数据__内部存在的数据特征__将数据集划分为__多个不同的类别__,使__类别内的数据比较相似__,__类别之间的数据相似度比较小__. 聚类算法的重点是计 ...

  7. 数据处理之衡量数据远近的多种距离公式

    距离公式 距离的判定 欧式距离 曼哈顿距离 切比雪夫距离 明可夫斯基距离 马氏距离 汉明距离 相似度的判定 余弦相似度 皮尔森相关系数 Jaccard相似系数 参考大神连接1: https://www ...

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

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

  9. KL散度,JS散度,余弦距离,欧式距离

    散度:量化两种概率分布P和Q之间差异的方式:相当于衡量两个函数之间的关系 GAN是最小化JS散度 VAE是最小化KL散度 KL散度(不对称):设p为随机变量X的概率分布,即p(x)为随机变量X在X=x ...

最新文章

  1. php 获取手机品牌,三到五年内,这家品牌要冲刺手机市场第一梯队
  2. python 权限控制 linux_16linux的acl的控制权限的介绍
  3. 开课吧python好吗-如何选择python培训机构?开课吧python培训怎么样?
  4. 操作系统:优先级反转
  5. 信息系统项目管理师真题及答案
  6. 数字图像处理与机器视觉——Visual C++与Matlab实现书中代码勘误
  7. ios html下拉刷新,Lottie_ios 实现下拉刷新
  8. Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数
  9. linux配置redis服务,记一次linux下安装redis, 设置redis服务, 及添加环境变量
  10. SpringCloud微服务(07):Zipkin组件,实现请求链路追踪
  11. Python实例讲解 -- 磁盘文件的操作
  12. 【289天】跃迁之路——程序员高效学习方法论探索系列(实验阶段47-2017.11.21)...
  13. 如何使用移动硬盘加密
  14. 竞价推广的流程有哪些?
  15. 网络工程初学者的学习方法及成长之路(红茶三杯)
  16. html单元格点击变色,当我将鼠标悬停在html表格上时,更改单元格的颜色
  17. win10中Edge浏览器升级后崩溃 STATUS_INVALID_IMAGE_HASH
  18. mysql特性绕过安全狗_【经验总结】SQL注入Bypass安全狗360主机卫士
  19. 大数据模型案例库-涵盖多行业,超百个实战项目案例
  20. Elasticsearch个人学习笔记

热门文章

  1. 构建Docker镜像时处理'Configuring tzdata'交互输入
  2. tesseract-ocr 识别图片中的数字
  3. 如何控制项目边界,与客户项目负责人结成同盟军
  4. Oracle数据库之同义词(SYNONYM)使用
  5. team网卡配置_在CentOS7中配置网路成组(Network Team)
  6. html颜色趋势,预测2015年网页设计配色趋势(4)
  7. 芯来科技开源软件调试命令解析(nuclei-linux-sdk、openocd.cfg)
  8. C++ 实现太阳系行星系统(OpenGL)
  9. webstorm插件使用
  10. 增量式PID控制算法及仿真