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

(例子:上图来自 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)
print(KL_divergence(p,q)) # 0.011735745199107783
print(KL_divergence(q,p)) # 0.013183150978050884
1
2
3
4
5
6
7
8
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)/2
return 0.5*scipy.stats.entropy(p, M)+0.5*scipy.stats.entropy(q, M)
print(JS_divergence(p,q)) # 0.003093977084273652
print(JS_divergence(p,q2)) # 0.24719159952098618
print(JS_divergence(p,p)) # 0.0
1
2
3
4
5
6
7
8
9
10
11
实例:身高分布预测比较
    在实际运用中,我们往往并不是一开始就能得到概率分布的,我们手上的更多是像每个人的身高这样的具体数据,那么怎么在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.0098
print(JS_div(h_real,h_predict2,num_bins=20)) # 0.135
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
我为预测1设置的参数和真实值更加接近。而预测1的散度的确更低,说明它是更好的预测。
---------------------
作者:blmoistawinde
来源:CSDN
原文:https://blog.csdn.net/blmoistawinde/article/details/84329103
版权声明:本文为博主原创文章,转载请附上博文链接!

https://blog.csdn.net/blmoistawinde/article/details/84329103相关推荐

  1. 数据采集之解析Mysql的binlog日志发送至Kafka实时消费(转:https://blog.csdn.net/liguohuabigdata/article/details/79472777)

    本文采用Maxwell来实现实时解析mysql的binlog日志发送至kafka 1.开启mysql binlog 环境中mysql是docker容器,所以需要进入容器修改mysql配置.docker ...

  2. https://blog.csdn.net/nameofcsdn/article/details/53164652

    https://blog.csdn.net/nameofcsdn/article/details/53164652 转载于:https://www.cnblogs.com/Yinku/p/106872 ...

  3. https://blog.csdn.net/cscscscsc/article/details/50

    https://blog.csdn.net/cscscscsc/article/details/50899522 转载于:https://blog.51cto.com/7237876/2129682

  4. GitHu的诞生记 转 https://blog.csdn.net/fanpeihua123/article/details/58151161

    前言:这篇文章应读者要求所写,主要聊聊版本管理系统(Version Control System,简称 VCS), 这篇文章不能让你学会一门技术, 但是希望能帮你理解版本管理的原理. "人肉 ...

  5. https://blog.csdn.net/wutianxu123/article/details/82597337

    web安全/渗透测试--1--web安全原则 版权声明:本文为博主原创文章,转载本站文章请注明作者和出处,请勿用于任何商业用途. https://blog.csdn.net/wutianxu123/a ...

  6. 自动车牌识别(ALPR)---https://blog.csdn.net/ELEVEN_ZOU/article/details/80893579

    1.基本功能:从一张或者一系列的图片中提取车牌信息,比如车牌号码.车牌颜色等信息. 2.功能扩展:车型.车品牌.车牌类型等. 3.应用方向:电子交易系统(停车自动收费.收费站自动支付等).交通执法.交 ...

  7. https://blog.csdn.net/watermelon_learn/article/details/88902117

    这里写自定义目录标题 第一次转载大神的文章,也是第一次发表csdn,有错大家请原谅. 华为2019年3月27日实习生笔试题及解答 第一次转载大神的文章,也是第一次发表csdn,有错大家请原谅. 我们对 ...

  8. https://blog.csdn.net/codezjx/article/details/8872090

    FBI Warning:欢迎转载,但请标明出处:http://blog.csdn.net/codezjx/article/details/8872090,未经本人同意请勿用于商业用途,感谢支持! 前言 ...

  9. https://blog.csdn.net/xm_csdn/article/details/74419683

    https://blog.csdn.net/xm_csdn/article/details/74419683

最新文章

  1. php定时删除目录,shell定时删除指定目录下的文件
  2. 关于软件公司如何进行知识分享的一些讨论
  3. jpush推送格式 swift_Swift中配置极光推送
  4. python在电脑哪可以找到_哪里可以找到比较靠谱的Python教程?
  5. 从分布式环境的特点、问题到CAP、BASE理论详解
  6. 父母延长退休,作为程序员的我光荣失业
  7. nginx平滑升级至最新版的nginx-1.9.5
  8. 网易云Api,轻松获取音乐数据
  9. NS和DNS的区别有哪些
  10. office在线编辑 html,Office在线编辑功能实现.doc
  11. JAVA-计算两篇文章的相似度
  12. input中加入搜索图标
  13. 永中office属于职称计算机吗,永中office
  14. 上海老百姓的胆量 VS 大牌店营业员的势利
  15. HTTPS证书基本概述
  16. 仿 trello php,使用jQuery-ui实现仿Trello风格的任务卡拖拉动画
  17. AI人工智能毕业设计课题:动物识别系统
  18. ERP中数据导入的注意事项&常见异常处理(EDI)
  19. 机器学习基础知识、与图像处理等技术的关系
  20. 博途S7-1200 和 S7-1200之间PROFINET以太网S7通信教程

热门文章

  1. 数据结构与算法——线性结构——线性表及其表示
  2. pycharm配置远程调试docker
  3. 一篇文章告诉你标准化和归一化的区别?
  4. virtualenv创建虚拟环境为主_多版本
  5. 自动驾驶QNX,Linux,Autosar概述
  6. TVM如何训练TinyML
  7. CUDA上的量化深度学习模型的自动化优化
  8. 为x86 CPU自动调度神经网络
  9. 在 CUDA C/C++ kernel中使用内存
  10. 使用现代C++如何避免bugs(下)