概率分布之间的距离度量以及python实现(三)

 

概率分布之间的距离,顾名思义,度量两组样本分布之间的距离 。

1、卡方检验

统计学上的χ2统计量,由于它最初是由英国统计学家Karl Pearson在1900年首次提出的,因此也称之为Pearson χ2,其计算公式为

\chi^2=\sum \frac{(A-E)^2}{E}=\sum_{i=1}^k \frac{(A_i-E_i)^2}{E_i}=\sum_{i=1}^k \frac{(A_i-np_i)^2}{np_i}  (i=1,2,3,…,k)

  其中,Ai为i水平的观察频数,Ei为i水平的期望频数,n为总频数,pi为i水平的期望频率。i水平的期望频数Ei等于总频数n×i水平的期望概率pi。当n比较大时,χ2统计量近似服从k-1(计算Ei时用到的参数个数)个自由度的卡方分布。

       卡方检验经常用来检验某一种观测分布是不是符合某一类典型的理论分布(如二项分布,正态分布等)。观察频数与期望频数越接近,两者之间的差异越小,χ2值越小;如果两个分布完全一致,χ2值为0;反之,观察频数与期望频数差别越大,两者之间的差异越大,χ2值越大。换言之,大的χ2值表明观察频数远离期望频数,即表明远离假设。小的χ2值表明观察频数接近期望频数,接近假设。因此,χ2是观察频数与期望频数之间距离的一种度量指标,也是假设成立与否的度量指标。如果χ2值“小”,研究者就倾向于不拒绝H0;如果χ2值大,就倾向于拒绝H0。至于χ2在每个具体研究中究竟要大到什么程度才能拒绝H0,则要借助于卡方分布求出所对应的P值来确定(通常取p=0.05)。

在python中的实现:

# -*- coding: utf-8 -*-
'''
卡方公式(o-e)^2 / e
期望值和收集到数据不能低于5,o(observed)观察到的数据,e(expected)表示期望的数据
(o-e)平方,最后除以期望的数据e
'''import numpy as np
from scipy.stats import chisquare        
list_observe=np.array([30,14,34,45,57,20])
list_expect=np.array([20,20,30,40,60,30])#方法一:根据公式求解(最后根据c1的值去查表判断)
c1=np.sum(np.square(list_observe-list_expect)/list_expect)#方法二:使用scipy库来求解
c2,p=chisquare(f_obs=list_observe, f_exp=list_expect)
'''
返回NAN,无穷小
''' 
if p>0.05 or p=="nan":print("H0 win,there is no difference")
else:print("H1 win,there is difference")

 

2、交叉熵

通常,一个信源发送出什么符号是不确定的,衡量它的不确定性可以根据其出现的概率来度量。概率大,出现机会多,不确定性小;反之就大。

不确定性函数f必须满足两个条件:

   1)是概率P的单调递降函数;

   2)两个独立符号所产生的不确定性应等于各自不确定性之和,即f(P1,P2)=f(P1)+f(P2),这称为可加性。

同时满足这两个条件的函数f是对数函数,即

在信源中,考虑的不是某一单个符号发生的不确定性,而是要考虑这个信源所有可能发生情况的平均不确定性。若信源符号有n种取值:U1…Ui…Un,对应概率为:P1…Pi…Pn,且各种符号的出现彼此独立。这时,信源的平均不确定性应当为单个符号不确定性-logPi的统计平均值(E),可称为信息熵,即

假设现在有一个样本集中两个概率分布p,q,其中p为真实分布,q为非真实分布。假如,按照真实分布p来衡量识别一个样本所需要的编码长度的期望为:
H(p)=
但是,如果采用错误的分布q来表示来自真实分布p的平均编码长度,则应该是:
H(p,q)=

 我们称H(p)为信息熵,称H(p,q)为交叉熵。

交叉熵在CNN分类中经常用到,用来作为预测值和真实标签值的距离度量。经过卷积操作后,最后一层出来的特征经过softmax函数后会变成一个概率向量,我们可以看作为是概率分布q, 而真实标签我们可以看作是概率分布p, 因此真实分布p和预测分布q的交叉熵就是我们要求的loss损失值,即

在python中的实现:

import numpy as np
import tensorflow as tffea=np.asarray([6.5,4.2,7.4,3.5],np.float32)
label=np.array([1,0,0,0])#方法一:根据公式求解
def softmax(x):return np.exp(x)/np.sum(np.exp(x),axis=0)
loss1=-np.sum(label*np.log(softmax(fea)))#方法二:调用tensorflow深度学习框架求解
sess=tf.Session()
logits=tf.Variable(fea)
labels=tf.Variable(label)
sess.run(tf.global_variables_initializer())
loss2=sess.run(tf.losses.softmax_cross_entropy(labels,logits))
sess.close()

 

3、相对熵(relative entropy)

又称为KL散度Kullback–Leibler divergence,简称KLD),信息散度(information divergence),信息增益(information gain)。

相对熵是交叉熵与信息熵的差值。即

相对熵=交叉熵-信息熵 

KL(p||q)=H(p,q)-H(p)

表示用分布q模拟真实分布p相比用p模拟p,所需的额外信息。

相对熵(KL散度)有两个主要的性质。如下

(1)尽管 KL 散度从直观上是个度量或距离函数,但它并不是一个真正的度量或者距离,因为它不具有对称性,即

(2)相对熵具有非负性

总结一下:

信息熵公式:

 

交叉熵公式:

 

 

相对熵公式:

三者的关系:

在python中的实现:

import numpy as np
import scipy.statsp=np.asarray([0.65,0.25,0.07,0.03])
q=np.array([0.6,0.25,0.1,0.05])#方法一:根据公式求解
kl1=np.sum(p*np.log(p/q))#方法二:调用scipy包求解
kl2=scipy.stats.entropy(p, q) 

 

4、js散度(Jensen-Shannon)

因为kl散度不具对称性,因此js散度在kl散度的基础上进行了改进:

现有两个分布p1和p2,其JS散度公式为:

 

在python中的实现:

import numpy as np
import scipy.statsp=np.asarray([0.65,0.25,0.07,0.03])
q=np.array([0.6,0.25,0.1,0.05])M=(p+q)/2#方法一:根据公式求解
js1=0.5*np.sum(p*np.log(p/M))+0.5*np.sum(q*np.log(q/M))#方法二:调用scipy包求解
js2=0.5*scipy.stats.entropy(p, M)+0.5*scipy.stats.entropy(q, M)

 

转载于:https://www.cnblogs.com/denny402/p/7050779.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++求职题

文章大部分内容转载https://www.cnblogs.com/lanxuezaipiao/p/4127904.html 1.冒泡排序法: 如果有N个数字需要排序,那么需要进行(N-1)趟循环,第i趟循环需要对比的次数为(N-i)。所以可以用双重循环,外层循环用于控制循环的趟数&a…

封装一个ViewPager真正的实现图片无限循环滚动带导航点

效果图: 大家在写项目的过程中常常会碰到须要实现Viewpager里面载入几张图片来循环自己主动轮播的效果,假设不封装一下的话代码分散在activity里面会显得非常乱。并且也不利于我们下次复用,所以这里我把viewpager的相关代码抽取出来放在了一个…

毕业论文页眉页脚页码插入

用word这么多年,第一次完整的操作了一遍页眉页脚页码的插入过程,其实三者都要要求奇偶页不同 1.页面布局-》右下角箭头-》版式-》奇偶页不同 因为文章不同的部分需要插入不同的页眉页脚页码,所以要在不同的部分插入分解符断开它们的连接 2、…

巴黎市中心降下2019年第一场雪

当地时间1月22日,法国巴黎市中心降下2019年第一场雪,气温也随之下降,街上的行人和车辆均有所减少。中新社记者 李洋 摄一对情侣在埃菲尔铁塔前合影留念。无家可归者在长椅上睡觉。游客在卢浮宫前拍照。

Echarts实现隐藏x轴,y轴,刻度线,网格

"yAxis": [{//就是一月份这个显示为一个线段,而不是数轴那种一个点点"show" : true,"boundaryGap": true,"type": "category","name": "时间","data": ["1月", "2…

Atom插件主题推荐

注意事项 主题和插件这方面,比 Sublime Text 人性化多了..一些比较用心的作者增加了二度设置功能。 何为二度设置,就是不用手写代码修改配置文件,点点鼠标,填填输入框就能生效,主题以 isotope-ui 这个做例子介绍,看图: 进入二度设…

印尼发生洪灾和山体滑坡 致多人死亡数千人撤离

当地时间1月23日,印尼南苏拉威西省望加锡居民受洪水影像,用竹筏运送摩托车。近日,印尼南苏拉威西省暴雨连连,造成洪灾和山体滑坡。目前,暴雨引发的洪灾和山体滑坡至少已造成8人死亡,数千人被迫撤离家园。。…

pycharm中无法import已经安装的ros中的库

使用pycharm写python程序,无法import 已经安装的ros包,并提示ImportError: No module named sensor_msgs.msg 解决方法如下 1. pycharm->file->settings->project:csvfile->project interpreter-> 点击右侧下三角选择 show all 2. 在弹…

tcp/ip知识点的总结

知识点搜集于网络,在加上自己的总结,还有很多不全,希望大家多提意见,共享学习! 一、TCP/IP是什么? TCP/IP是一个协议族,而不是单独的协议。包括arp、ip、icmp、tcp、udp、http、ftp等协议 二、T…

imu_utils标定imu问题解决

在编译过程中遇到的一些问题可以参照这个女生的文章 https://blog.csdn.net/fang794735225/article/details/92804030 下面是imu_utils的主页,可以下载代码,也有使用步骤 https://github.com/gaowenliang/imu_utils 我下载了imu_utils主页最后面提供…

术语-服务:PaaS

ylbtech-术语-服务:PaaSPaaS是Platform-as-a-Service的缩写,意思是平台即服务。 把服务器平台作为一种服务提供的商业模式。通过网络进行程序提供的服务称之为SaaS(Software as a Service),而云计算时代相应的服务器平台或者开发环境作为服务…

1.App瘦身经验总结

为什么apk越来越大? 1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多3.引入的第三方sdk或开源库越来…

研究相机和IMU坐标系变换

刚开始录制的数据时没有考虑相机和IMU之间的坐标变换,但是后来发现跟踪效果不好,去查验imu数据时,发现,我采集保存的imu数据格式没有和euroc数据集中的imu数据保存格式统一,所以需要研究的是在euroc用于数据采集的设备…

第五天:Swift拖动 item 重排 CollectionView

参考链接:https://www.jianshu.com/p/96f956f1479e 1 import UIKit2 3 enum VC: String {4 case ViewController5 case CollectionViewController6 7 func segueIdentifier() -> String {8 switch self {9 case .ViewController:10 …

MIT Kimera阅读笔记

这两天在调研SLAM的最新算法,找到了2019CVPR上的一篇文章,出自于MIT,因为要给其他同事讲解,所以就把文章的重点内容在我个人理解的情况下翻译了出来,有理解不到位的还请各位大佬多多批评指正。 最后附上了Delaunay Tri…

YodaOS: 一个属于 Node.js 社区的操作系统

开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> 大家好,很开心在这里宣布 YodaOS开源了。他将承载 Rokid 4年以来对于人工智能和语音交互领域的沉淀,并选择 Node.js 作为操作系统的一等开发公民&#xff0…

Android顶部粘至视图具体解释

不知从某某时间開始,这样的效果開始在UI设计中流行起来了。让我们先来看看效果:大家在支付宝、美团等非常多App中都有使用。要实现这个效果,我们能够来分析下思路:我们肯定要用2个一样的布局来显示我们的粘至布局。一个是正常的、…

在实际项目开发中keil的调试方法

转载2015-06-14 20:23:04 一.在keilc的调试状态下,如何观察各个片内外设的运行状态?如何修改它们的设置?​ 在调试状态下,点击Peripherals菜单下的不同外设选项命令,就会显示或隐藏对应外设的观察窗口。 在程序运行时&…

小李飞刀:用python刷题ing....

叨逼叨 默认每天都要刷两道题。今天目标已完成。 第一题 26. 删除排序数组中的重复项难度:简单类型:数组 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用…

VI-ORB环境配置

参考博客:https://blog.csdn.net/qq_38589460/article/details/82559816 https://blog.csdn.net/Robot_Starscream/article/details/90245456 本机安装的是opencv3.0 在Examples/ROS/ORB-VIO以及/VI-ORB/src/LearnVIORB-RT下的CMakeLists.txt都要进行修改 将find_package(O…