python中的联合熵

时间:2013-09-16 12:25:57

标签: python math numpy entropy

我有两个数组:

import numpy as np
a = np.array(['1','2','3'])
b = np.array(['3','4','1','5'])

我想计算联合熵。我找到了一些材料来制作它:

import numpy as np
def entropy(*X):
    return = np.sum(-p * np.log2(p) if p > 0 else 0 
        for p in (np.mean(reduce(np.logical_and, (predictions == c for predictions, c in zip(X, classes))))
        for classes in itertools.product(*[set(x) for x in X])))

似乎与len(a) = len(b)一起正常工作但如果len(a) != len(b)

则以错误结束

UPD:数组ab是从exampled主输入创建的:

b:3 p1:1 p2:6 p5:7
b:4 p1:2 p7:2
b:1 p3:4 p5:8
b:5 p1:3 p4:4 

从p1值创建数组a的位置。因此,并非每一行都包含每个pK,但每个行都有b属性。我需要为每个I(b,pK)计算互信息pK

2 个答案:

答案 0 :(得分:2)

假设您正在谈论Joint Shannon Entropy,那么公式很简单:

enter image description here

当我看到你到目前为止所做的事情时,问题是你缺少P(x,y),即两个变量一起出现的联合概率。看起来a,b分别是事件a和b的个体概率。

您发布的代码存在其他问题(在评论中提到):

  1. 您的变量不是数字数据类型a=["1","2"] a=[1,2]相同。一个是字符串,另一个是数字。
  2. 输入数据的长度必须相同,即对于A中的每个x,B AND 中必须有ay,您需要知道联合概率P(x,y)

答案 1 :(得分:0)

这是一个主意:

  • 将数据转换为数字
  • 添加填充示例零
import numpy as np
from scipy import stats

a = np.array(['1','2','3','0'])
b = np.array(['3','4','1','5'])
aa = [int(x) for x in a]
bb = [int(x) for x in b]
je =  stats.entropy(aa,bb)
print("joint entropy : ",je)

输出:0.9083449242695364