代码之家  ›  专栏  ›  技术社区  ›  user9410826

Kullback-Lieber散度用于测量两个概率函数之间的重叠

  •  0
  • user9410826  · 技术社区  · 7 年前

    我试图确定KL散度,以测量两个密度函数(2dhistogram)之间的重叠。

    下面是我目前拥有的代码。但是输出是一个数字列表,而不是一个值?

    import matplotlib.pyplot as plt
    import random
    import scipy.stats
    
    A_x = [random.randrange(1,100,1) for _ in range (10000)]
    A_y = [random.randrange(1,100,1) for _ in range (10000)]
    
    B_x = [random.randrange(1,100,1) for _ in range (100000)]
    B_y = [random.randrange(1,100,1) for _ in range (100000)]
    
    fig, ax = plt.subplots()
    ax.grid(False)
    
    a,x,y,p = plt.hist2d(A_x,A_y, bins = 100)
    b,x,y,p = plt.hist2d(B_x,B_y, bins = 100)      
    
    div = scipy.stats.entropy(a, qk= b, base=None)     
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   bnaecker    7 年前

    scipy.stats.entropy 假设分布是一维的。查看docstring,您可以看到:

    S = -sum(pk * log(pk), axis=0)
    

    这意味着它在第一个轴上求和。给它一个数组的形状 (m, n) 会给你一个形状的结果 (n,) ,这类似于将数组的每一行视为一对单独的分布。

    但是熵的定义并不关心分布的维数。这只是一个事件的概率,在你的例子中,它是 a b 。因此,您可以执行以下操作:

    div = scipy.stats.entropy(a.ravel(), qk=b.ravel(), base=None)
    

    你会得到KL散度的一个值。