赞
踩
# -*- 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。