【问题标题】:Joint entropy in pythonpython中的联合熵
【发布时间】:2013-09-16 12:25:56
【问题描述】:

我有两个数组:

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 是根据示例主输入创建的:

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 

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

【问题讨论】:

  • 这只是一个猜测,但请确保 zip 是您想要的,而不是像 itertools.izip_longest 这样的东西。
  • 你不能以这种方式构建一个 numpy 数组。也许缺少一对括号?另外:您的数据是什么类型(字符串还是整数?)。
  • @btel 我只是没有提到import numpy as npnp.array([..]) 只是想向您展示我使用的数据类型。数据是 int chars(所以我认为使用什么都没关系)。
  • 好的,但仍然缺少括号“(..)” - 所以你的语法是错误的。
  • 条件熵也需要两个数组长度相等。事实上,您可以从联合熵和个体熵 -> H(X|Y) = H(X,Y) - H(Y) 计算它。如果您提供更多详细信息,也许会更容易提供帮助。

标签: python math numpy entropy


【解决方案1】:

假设你说的是Joint Shannon Entropy,公式很简单:

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

您发布的代码(在 cmets 中提到)还有其他问题:

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

【讨论】:

  • 是的。 1.没关系。 2. 这就是重点。计算联合熵的主要问题是使ab 的长度相同而不会得到错误的结果。我想这可以通过将数据从数组传输到矩阵来完成。
  • @aromatvanili 我的观点是联合概率是一个新信息,它看起来不像您的问题中存在。
【解决方案2】:

这是一个想法:

  • 将数据转换为数字
  • 添加填充示例零
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多