原标题:数据集相似度度量之KL&JS散度

一、KL散度

1、什么是KL散度

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

2、有什么样的作用

模型效果好不好,在数据划分上大有讲究,如果训练集与测试集数据分布不满足同分布,模型表现必然不会太好,因此划分数据集之后对于两个数据分布验证变得非常重要,针对分类任务验证概率质量相似度,针对回归问题验证两者的概率密度相似度,两者分布越相似,相对熵越接近于0;

3、实现方式

a、离散性标签,各标签概率及相应对数求和操作

b、连续型标签,针对x的无个数区间概率及对数积分操作

fromsklearn importdatasets

fromcollections importCounter

importnumpy asnp

random_state= 32

defgetData(n_classes ,weights ,n_features ,n_samples):

train ,label=datasets.make_classification( n_classes=n_classes ,class_sep= 2,weights=weights ,n_features=n_features ,n_samples=n_samples ,random_state=random_state)

returntrain ,label

defcomputePdotLnP(p ,q ,I= True):

ifI:

returnp*np.log(p/q)

else:

returnp*np.log(p/q)* 0.01

defcomputeKL(train_label:np.array ,test_label:np.array):

KlValue= 0.0

n_train_label=Counter(train_label)

n_test_label=Counter(test_label)

forkey ,value inn_train_label.items():

p=value/train_label.shape[ 0]

q=n_test_label[key]/test_label.shape[ 0]

KlValue+=computePdotLnP(p ,q ,True)

returnKlValue

defcomputeSplitValue(label ,splitValue):

maxValue = np.max(label) + 0.1

minValue = np.min(label)

splitvalue = [i fori innp.arange(minValue ,maxValue ,splitValue)]

returnsplitvalue

defdataDiscretization(train_label ,label:np.array ,splitValue):

splitvalue=computeSplitValue(train_label ,splitValue)

splitDict={}

forrow inlabel:

fori inrange( len(splitvalue)- 1):

ifrow>=splitvalue[i] androw

ifsplitvalue[i] insplitDict:

splitDict[splitvalue[i]]+= 1

else:

splitDict[splitvalue[i]]= 1

returnsplitDict

defcomputeK_L(train_label:np.array ,test_label:np.array):

n_train_label=dataDiscretization(train_label ,train_label ,0.01)

n_test_label=dataDiscretization(train_label ,test_label ,0.01)

KlValue= 0.0

forkey ,value inn_train_label.items():

try:

p=value/train_label.shape[ 0]

q = n_test_label[key] / test_label.shape[ 0]

KlValue += np.abs(computePdotLnP(p ,q ,False))

except:

pass

return KlValue

train ,label_train=getData( n_classes= 2,weights=[ 0.1,0.9] ,n_features= 10,n_samples= 3000)

test ,label_test=getData( n_classes= 2,weights=[ 0.6,0.4] ,n_features= 10,n_samples= 3000)

print( "分类标签的KL散度",computeKL(label_train ,label_test))

label_train_value=np.random.rand( 100)

label_test_value=np.random.rand( 100)

print( "连续标签的KL散度",computeK_L(label_train_value ,label_test_value))

二、JS散度

1、JS散度与KL散度

之前有写过KL散度,KL散度由于不符合距离中的对称性,所以在KL散度的基础上进行了改进,形成了JS散度,

KL散度计算公式:KL(P||Q)=sum(P(i)*log(P(i)/Q(i))

JS散度计算公式:JS(P||Q)=0.5*KL(P||(P+Q)/2)+0.5*KL(Q||(P+Q))

2、Python实现(离散变量)

fromsklearn importdatasets

fromcollections importCounter

importnumpy asnp

random_state= 32

defgetData(n_classes ,weights ,n_features ,n_samples):

train ,label=datasets.make_classification( n_classes=n_classes ,class_sep= 2,weights=weights ,n_features=n_features ,n_samples=n_samples ,random_state=random_state)

returntrain ,label

defcomputePdotLnP(p ,m ,I= True):

ifI:

returnp*np.log(p/m)

else:

returnp*np.log(p/m)

defcomputeJS(train_label:np.array ,test_label:np.array):

KlValue= 0.0

n_train_label=Counter(train_label)

n_test_label=Counter(test_label)

forkey ,value inn_train_label.items():

p=value/train_label.shape[ 0]

q=n_test_label[key]/test_label.shape[ 0]

m=(p+q)/ 2

KlValue+= 0.5*computePdotLnP(p ,m ,True)+ 0.5*computePdotLnP(q ,m ,True)

returnKlValue

train ,label_train=getData( n_classes= 2,weights=[ 0.6,0.4] ,n_features= 10,n_samples= 3000)

test ,label_test=getData( n_classes= 2,weights=[ 0.6,0.4] ,n_features= 10,n_samples= 3000)

print( "分类标签的JS散度",computeJS(label_train ,label_test))

由于水平有限,请参照指正~返回搜狐,查看更多

责任编辑:

python计算矩阵的散度_数据集相似度度量之KLJS散度相关推荐

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

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

  2. 【Python】如何用 python 计算矩阵相乘 - numpy.dot()

    文章目录 一.如何用 python 计算矩阵乘法? 二.实例 参考链接 一.如何用 python 计算矩阵乘法? 使用 Numpy 包里的 dot() 函数. 该函数主要功能有两个:向量点积 和 矩阵 ...

  3. python判断矩阵是否对称_矩阵的特征分解(推导+手算+python计算+对称矩阵的特征分解性质)...

     1. 前言 最近几天一直在学习矩阵的知识,恶补了特征分解和SVD算法,发现网上很多资料都是不全的,所以想记录一下这里面的特征分解推导过程. 2.矩阵的进阶知识 2.1 特征分解(谱分解)=> ...

  4. 用python计算圆的面积_用Python计算大圆距

    用python计算圆的面积 The shortest distance between two locations on the surface of Earth (or any planet) is ...

  5. python计算时间差的方法_如何计算时间差,用Python算法的话

    这篇文章主要介绍了python计算时间差的方法,实例分析了Python时间操作的相关模块与技巧,需要的朋友可以参考下 本文实例讲述了python计算时间差的方法.分享给大家供大家参考.具体分析如下: ...

  6. python计算矩阵对角线之和_Python练习题 028:求3*3矩阵对角线数字之和

    [Python练习题 028] 求一个3*3矩阵对角线元素之和 ----------------------------------------------------- 这题解倒是解出来了,但总觉得 ...

  7. python计算文件md5值_用python 正确计算大文件md5 值

    python 计算文件的md5值很方便,但如果只是简单的把文件都入到内存中,大文件会导致问题,一般采用切片的方式分段计算,下面的几个函数可以很好的解决这个问题. 使用 hashlib import h ...

  8. python计算文件md5值_用python计算文件的MD5值

    md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...

  9. python计算存款本息和_假如你有1000万存款!躺着够花几年,用Python分分钟告诉你!...

    今天同学聚会,轮到我做东,在学校附近找了一个馆子.哥几个好久没见了,聚餐吃牛蛙火锅,还喝了几瓶啤酒,吃完饭小编去买单一共花了386元.哎..这个月的生活费又要省点了,有的时候我在想如果你有1000万, ...

  10. r语言把两个折线图图像放到一个图里_图像相似度度量

    图像相似度度量的应用场景很多,包括以图搜图,相似图像去重等多种功能,目前在项目中的场景是针对大量重复类似的图片,需要进行筛选剔除,自然需要用到图像相似度,简单调研了下图像相似度的方法,包括传统图像方法 ...

最新文章

  1. Linux登录那点事
  2. Linux中look命令,如何在Linux上使用look命令 | MOS86
  3. 日志查看工具 linux,用 Logwatch 工具查看 Linux 系统 Log 日志
  4. 蓝桥杯_算法训练_矩阵乘法
  5. RHEL5搭建apache服务器全过程(四)配置heartbeat和ipvsadm
  6. mysql下载哪一代版本好_潮一代更好的设计
  7. php mysql 线程安全_PHP 线程安全与非线程安全版本的区别深入解析
  8. oracle关闭rs,Oracle 关闭(shutdown immediate)时hang住
  9. Intellij Idea 离线安装插件
  10. AAAI 2020 | 腾讯优图10篇论文入选,含速算识别、视频识别等主题
  11. 【转】新.Net开发必备工具详解之Snippet Compiler。
  12. Django 07. django框架模型之增删改查基本操作
  13. IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题)
  14. uni中的web-view
  15. Kubernetes 三大探针及探针方式
  16. 3dmax制作三维地形图
  17. Avoid adding reactive properties to a Vue instance or its root $data at runtime - declar
  18. 360浏览器,qq浏览器等登录页输入账号密码,在页面内再次遇见有密码框的地方会自动填充的解决办法。
  19. Re: 什么是OO思想
  20. 读吕林根之《解析几何》

热门文章

  1. 极域电子教室破解控制---万能密码、查找密码
  2. mysql配置文件(完整版)
  3. VS2015安装使用番茄助手Visual Assist
  4. windows 中获取字体文件名
  5. AppLoader的使用
  6. 解决新用户注册Kaggle无法显示验证码的问题
  7. 讯飞语音转文字_踩坑记:讯飞语音转文字SDK的坑
  8. 阿里云加速器拉取tomcat
  9. Jmeter之web压力测试
  10. cadence学习笔记(2)-PCB封装库制作