python计算矩阵的散度_数据集相似度度量之KLJS散度
原标题:数据集相似度度量之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散度相关推荐
- kl散度与js散度_数据集相似度度量之KLamp;JS散度
一.KL散度 1.什么是KL散度 KL散度又叫相对熵,是描述两个概率分布差异的一种方法,有人将KL散度称为KL距离,但实际上它不满足距离概念中的两个条件,a.对称性,即D(P||Q)=D(Q||P); ...
- 【Python】如何用 python 计算矩阵相乘 - numpy.dot()
文章目录 一.如何用 python 计算矩阵乘法? 二.实例 参考链接 一.如何用 python 计算矩阵乘法? 使用 Numpy 包里的 dot() 函数. 该函数主要功能有两个:向量点积 和 矩阵 ...
- python判断矩阵是否对称_矩阵的特征分解(推导+手算+python计算+对称矩阵的特征分解性质)...
1. 前言 最近几天一直在学习矩阵的知识,恶补了特征分解和SVD算法,发现网上很多资料都是不全的,所以想记录一下这里面的特征分解推导过程. 2.矩阵的进阶知识 2.1 特征分解(谱分解)=> ...
- 用python计算圆的面积_用Python计算大圆距
用python计算圆的面积 The shortest distance between two locations on the surface of Earth (or any planet) is ...
- python计算时间差的方法_如何计算时间差,用Python算法的话
这篇文章主要介绍了python计算时间差的方法,实例分析了Python时间操作的相关模块与技巧,需要的朋友可以参考下 本文实例讲述了python计算时间差的方法.分享给大家供大家参考.具体分析如下: ...
- python计算矩阵对角线之和_Python练习题 028:求3*3矩阵对角线数字之和
[Python练习题 028] 求一个3*3矩阵对角线元素之和 ----------------------------------------------------- 这题解倒是解出来了,但总觉得 ...
- python计算文件md5值_用python 正确计算大文件md5 值
python 计算文件的md5值很方便,但如果只是简单的把文件都入到内存中,大文件会导致问题,一般采用切片的方式分段计算,下面的几个函数可以很好的解决这个问题. 使用 hashlib import h ...
- python计算文件md5值_用python计算文件的MD5值
md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...
- python计算存款本息和_假如你有1000万存款!躺着够花几年,用Python分分钟告诉你!...
今天同学聚会,轮到我做东,在学校附近找了一个馆子.哥几个好久没见了,聚餐吃牛蛙火锅,还喝了几瓶啤酒,吃完饭小编去买单一共花了386元.哎..这个月的生活费又要省点了,有的时候我在想如果你有1000万, ...
- r语言把两个折线图图像放到一个图里_图像相似度度量
图像相似度度量的应用场景很多,包括以图搜图,相似图像去重等多种功能,目前在项目中的场景是针对大量重复类似的图片,需要进行筛选剔除,自然需要用到图像相似度,简单调研了下图像相似度的方法,包括传统图像方法 ...
最新文章
- Linux登录那点事
- Linux中look命令,如何在Linux上使用look命令 | MOS86
- 日志查看工具 linux,用 Logwatch 工具查看 Linux 系统 Log 日志
- 蓝桥杯_算法训练_矩阵乘法
- RHEL5搭建apache服务器全过程(四)配置heartbeat和ipvsadm
- mysql下载哪一代版本好_潮一代更好的设计
- php mysql 线程安全_PHP 线程安全与非线程安全版本的区别深入解析
- oracle关闭rs,Oracle 关闭(shutdown immediate)时hang住
- Intellij Idea 离线安装插件
- AAAI 2020 | 腾讯优图10篇论文入选,含速算识别、视频识别等主题
- 【转】新.Net开发必备工具详解之Snippet Compiler。
- Django 07. django框架模型之增删改查基本操作
- IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题)
- uni中的web-view
- Kubernetes 三大探针及探针方式
- 3dmax制作三维地形图
- Avoid adding reactive properties to a Vue instance or its root $data at runtime - declar
- 360浏览器,qq浏览器等登录页输入账号密码,在页面内再次遇见有密码框的地方会自动填充的解决办法。
- Re: 什么是OO思想
- 读吕林根之《解析几何》