KL距离学习

# -*- coding: utf-8 -*-
"""
Created on Wed Jan  9 07:56:39 2019

@author: shenfangyuan
KL距离的计算例子
https://www.cnblogs.com/wt869054461/p/7156397.html
参见:https://blog.csdn.net/qtlyx/article/details/51834684
1,计算公式:
    KL = \sim_i^N p(i) log ( p(i)/q(i) )
    P(x=i)  i=1...N 是每个x=i取值的概率.
    Q(x=i)  i=1...N 是每个x=i取值的概率.
    i=1...N 是概率分布中,样本x取值的空间,我们通过sum遍历这个空间的所有点
  例如: 假设我们有这样的两个分布,P和Q,他们出现0和1的概率如下。
  P(0) = 1/2=0.5   P(1) = 1/2=0.5
  Q(0) = 1/4=0.25  Q(1) = 3/4=0.75
  这个时候,我们计算P和Q之间的KL散度,就是这样:
  DL(P|Q) = 0.5*log(0.5/0.25) + 0.5*log(0.5/0.75)
2,KL距离是非对称的,需要关注分母 Q(x)=0值得情况.
3,对于数据集D,我们可以通过不同的方法得到分布函数的估计,例如:一种分布从
直方图获得P(x),另一种方式从神经网络获得分布Q(x),通过KL距离,求取通过不同方法
得到的关于数据集D的分布之间的距离.
"""

import numpy as np
import scipy.stats

#数据含义说明:
#随机变量 p(x(1)) = 0.65, p(x(2)) = 0.25,  p(x(3)) = 0.07, p(x(4)) = 0.03
# p/q计算的是两个向量对应元素相除,结果仍然是向量
# log(p/q) 对相除结果的每个元素取log计算
# 这里的P(x)和Q(x)是数据集合D的概率分布数据(例如:直方图数据),而不是原始数据D

p=np.asarray([0.65,0.25,0.07,0.03]) #np.asarray与np.array 区别
#p=np.array([0.65,0.25,0.07,0.03])
q=np.array([0.6, 0.25,0.1, 0.05])
print('p/q:', p/q)
#方法一:根据公式求解
kl1=np.sum(p*np.log(p/q))

#方法二:调用scipy包求解
kl2=scipy.stats.entropy(p, q)
print('kl1=',kl1,'\nkl2=',kl2)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值