相关文章推荐
文雅的香槟  ·  C-130运输机_百度百科·  1 年前    · 
博学的瀑布  ·  进攻“拉跨”,36岁高龄的伊戈达拉,能为热火 ...·  1 年前    · 
有胆有识的油条  ·  【科普】石斛是“中华仙草”?看完你就懂了_图 ...·  3 年前    · 
绅士的闹钟  ·  提醒车主!电动车、三轮车如何载人、走道不被罚 ...·  3 年前    · 
玩手机的硬盘  ·  让“书香”触手可及,上海市政协机关“智慧书吧”上线·  3 年前    · 
小百科  ›  KL散度及Python实现_python kl散度
梯度
慷慨大方的保温杯
2 年前
  • 1 KL散度
    • 1.1 定义
    • 1.2 公式
    • 1.3 几个结论
    • 1.4 应用
      • 1.4.1 应用1:机器学习领域
      • 1.4.2 应用2:用户画像
    • 2 Python实现求解
      • 2.1 生成分布
      • 2.2 计算方法1
      • 2.3 计算方法2

      1 KL散度

      在很多场合,经常会遇到KL散度这个概念,那么它到底是什么含义呢?如何定义的?又有哪些应用场景?最后如何用Python进行计算呢?

      1.1 定义

      KL散度(Kullback-Leibler divergence,简称KLD):

      • 在信息系统中称为 相对熵 (relative entropy)
      • 在连续时间序列中称为 随机性 (randomness)
      • 在统计模型推断中称为 信息增益 (information gain)。也称 信息散度 (information divergence)。

      KL散度是用于衡量分布P相对于分布Q的差异性。典型情况下,P表示数据的真实分布,Q表示数据的理论分布、估计的模型分布、或P的近似分布

      注:这个指标不能用作距离衡量,因为该指标不具有对称性,DKL(P|Q) ≠ DKL(Q|P)

      1.2 公式

      离散分布:

      D K L ​ ( P ∣ Q ) = ∫ − ∞ ∞ ​ p ( x ) lo g q ( x ) p ( x ) ​ d x

      • KL散度是大于等于0的,所以可以作为衡量两个分布之间不相似程度的度量,越小越相似,越大越不相似。
      • 最小化KL等价于最大化似然函数

      1.4 应用

      1.4.1 应用1:机器学习领域

      机器学习领域中的生成模型往往涉及到生成尽可能反映真实情况的分布模型 。

      比如,生成对抗网络(GAN)在图片上的应用往往执行的是类似 基于黑白图片生成看起来尽量真实的彩色图片这样的任务 。在这类似的应用中,输入往往是图像或像素。网络会学习这些像素之间的依赖关系(比如临近像素通常有相似的颜色),然后使用它来创建看起来尽量真实的图像。因此,生成器的目标就是 最小化所学到的像素分布于真实图像像素分布之间的散度 。

      1.4.2 应用2:用户画像

      比如电商场景,可以 使用KL散度去计算同一类型商品不同用户群体之间的金额(或其余指标)KL散度 ,如果都很接近,说明这个类型商品不是不同用户群体之间的差异点,可以进行剔除, 只保留有差异性的商品类型(KL散度较大) ,这样就可以基于结果去对用户进行更好的画像~

      2 Python实现求解

      2.1 生成分布

      import numpy as np
      import scipy.stats
      # 随机生成两个离散型分布
      x = [np.random.randint(1, 11) for i in range(10)]
      print(x)
      print(np.sum(x))
      px = x / np.sum(x)
      print(px)
      y = [np.random.randint(1, 11) for i in range(10)]
      print(y)
      print(np.sum(y))
      py = y / np.sum(y)
      print(py)
      
      [9, 3, 10, 5, 10, 4, 7, 6, 8, 1]
      [0.14285714 0.04761905 0.15873016 0.07936508 0.15873016 0.06349206
       0.11111111 0.0952381  0.12698413 0.01587302]
      [6, 5, 10, 1, 7, 9, 9, 6, 2, 8]
      [0.0952381  0.07936508 0.15873016 0.01587302 0.11111111 0.14285714
       0.14285714 0.0952381  0.03174603 0.12698413]
      

      2.2 计算方法1

      # 利用scipy API进行计算
      # scipy计算函数可以处理非归一化情况,因此这里使用
      # scipy.stats.entropy(x, y)或scipy.stats.entropy(px, py)均可
      用函数entropy用x和y 或者 px, py 都可以
      KL = scipy.stats.entropy(px, py)
      print(KL)
      KL = scipy.stats.entropy(x, y)
      print(KL)
      
      0.2815657077409675
      0.2815657077409676
      

      2.3 计算方法2

      # 编程实现
      用公式编程就用px和py
      KL = 0.0
      for i in range(10):
          KL += px[i] * np.log(px[i] / py[i])
      # print(str(px[i]) + ' ' + str(py[i]) + ' ' + str(px[i] * np.log(px[i] / py[i])))
      print(KL)
      
      0.2815657077409677
      

      验证对称性不成立:

      KL = scipy.stats.entropy(y, x)
      print(KL)
      
      0.3085447676484088
      

      确实和上述0.28不一致~

      • https://blog.csdn.net/jacke121/article/details/107852096
      • https://www.jianshu.com/p/43318a3dc715
      • https://zhuanlan.zhihu.com/p/39682125
      • https://zh.wikipedia.org/wiki/%E7%9B%B8%E5%AF%B9%E7%86%B5
      • 应用参考:https://www.cnblogs.com/charlotte77/p/5392052.html
      • 应用参考2:https://blog.csdn.net/june_young_fan/article/details/114935283
      1.KL散度 KL散度( Kullback–Leibler divergence) (最大类间散度) 是描述两个概率分布差异的一种测度。对于两个概率分布P、Q,二者越相似,KL散度越小。 KL散度的性质:P:真实分布,Q:P的拟合分布 非负性:KL(P||Q)>=0,当P=Q时,KL(P||Q)=0; 反身性:KL(P||P)=0 非对称性:D(P||Q) ≠ D(Q||P) KL散度不满足三角不等式 from scipy import stats P = [0.2, 0.4, 0.4] Q = [0.4, 0.2, 0.5] print(stats.entropy(P,Q)) 0.144 KL散度又是一个从信息论、熵的角度考量距离的一个量。但是,这里说他是距离有点不妥,因为距离需要满足4个条件: 1) d(x,x) = 0                    反身性 2) d(x,y) >= 0                  非负性 3) d(x,y) = d(y,x)              对称性 4) d(x,k)+ d(k,y) >= d(x,y)    三 本文介绍了KL散度的概念及其在Python中的实现在Python中的实现。通过理解和应用KL散度,我们可以更好地理解和分析概率分布之间的差异,从而优化我们的模型和算法。在这个函数中,我们首先将输入的概率分布转换为NumPy数组,然后使用np.where函数来处理概率为0的情况,避免出现无穷大的结果。除了计算KL散度之外,我们还可以使用KL散度进行其他任务,例如概率分布的比较和优化。通过计算不同概率分布之间的KL散度,我们可以衡量它们的差异程度,从而帮助我们进行模型选择、特征选择等任务。 在信息论和统计学中,KL散度被广泛应用于各种领域,如机器学习、数据压缩和模式识别等。本文将介绍如何在Python中实现KL散度的计算,并提供相应的源代码。需要注意的是,KL散度不是对称的,即KL(P||Q)与KL(Q||P)的值可能不相等。因此,在实际应用中,需要根据具体的问题和应用场景来选择使用哪个方向的KL散度。首先,我们需要了解KL散度的定义。的函数,该函数接受两个概率分布p和q作为输入,并返回它们的KL散度值。例如,SciPy库中的。函数并将示例概率分布p和q作为参数传入,计算得到了KL散度的值。 KL散度(Kullback-Leibler divergence)是描述两个概率分布 P 和 Q 差异的一种方法。在概率论或信息论中,又称相对熵(relative entropy)。它是非对称的,这意味着 D(P||Q) ≠ D(Q||P) 。特别的,在信息论中,D(P||Q) 表示当用概率分...

      1.3 几个结论

 
推荐文章
文雅的香槟  ·  C-130运输机_百度百科
1 年前
博学的瀑布  ·  进攻“拉跨”,36岁高龄的伊戈达拉,能为热火队带来哪些帮助?_防守 ...
1 年前
有胆有识的油条  ·  【科普】石斛是“中华仙草”?看完你就懂了_图片新闻_汕头市卫生健康 ...
3 年前
绅士的闹钟  ·  提醒车主!电动车、三轮车如何载人、走道不被罚,遵守标准告诉你_ ...
3 年前
玩手机的硬盘  ·  让“书香”触手可及,上海市政协机关“智慧书吧”上线
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号