【问题标题】:How to compare 2D distributions?如何比较二维分布?
【发布时间】:2019-08-02 16:51:58
【问题描述】:

我需要将 2D 分布与 KL Divergence 进行比较。我尝试使用scipy.stats.entropy,但返回的是inf

如何设置 scipy.stats.entropy 以使用 2 个轴并返回一个值?

我试过了:

from scipy.stats import entropy
import pandas as pd

one = pd.read_csv(file_one)
two = pd.read_csv(file_two)
pk = [list(item) for item in zip(one["X"], one["Y"])]
qk = [list(item) for item in zip(two["X"], two["Y"])]
for l in [pk, qk]:
    for i in range(len(l)):
        for j in range(len(l[i])):
            # to confirm that no values are 0 
            #(will change to a smaller value once inf is not being returned)
            if abs(l[i][j]) < 0.1:
                l[i][j] = 0.1
print(entropy(pk, qk))

打印:[inf inf]

我真正想要的是一个单一的值,但要开始我需要它停止返回ing

【问题讨论】:

  • 你能打印出pkqk的范围吗?根据文档中的方程式,两个值都不能为负。还要检查你是否有任何 nans。
  • 数据中有负值。如果我将所有值转变为正值,会影响结果吗?
  • 如果你有负值那么你实际上没有概率分布并且测试将失败......
  • 为什么不以同样的方式展平分布并将其用作某些 KL Divergence 函数的输入?
  • 我一直在尝试从完全关闭的数据中获取坐标。我现在要使用直方图,它实际上是概率

标签: python scipy entropy


【解决方案1】:

查看 KL Divergence 的方程:

S = sum(pk * log(pk / qk), axis=0)

如果你在 qk 中有零值,这将导致你的无穷大。由于 KL 是分布中事件的概率密度(甚至是离散的)概率永远不会为零,因此您应该用非常小的值替换您的零。至于您的形状问题,您可以展平输入或获取直方图。

编辑: 你也不能有负值,什么是负概率? KL 散度比较概率分布它没有另外定义。

【讨论】:

  • 我将 0 转换为小值 if abs(l[i][j]) &lt; 0.1: l[i][j] = 0.1。问题是负值
猜你喜欢
  • 2022-01-23
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 2021-09-04
相关资源
最近更新 更多