当前位置:   article > 正文

KL距离学习_kl距离公式

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)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/331413
推荐阅读
相关标签
  

闽ICP备14008679号