香农熵互信息

aro*_*ili 7 python math entropy

我有一些属性的统计数据,如:

1st iter : p1:10 p2:0 p3:12 p4:33 p5:0.17 p6:ok p8:133 p9:89
2nd iter : p1:43 p2:1 p6:ok p8:12 p9:33
3rd iter : p1:14 p2:0 p3:33 p5:0.13 p9:2
...

(p1 -> number of tries, p2 -> try done well, p3..pN -> properties of try).
Run Code Online (Sandbox Code Playgroud)

我需要计算每个房产的信息量.在量化一些程序(例如10级)以使所有输入数字在同一级别之后,输入文件开始如下所示:

p0: 4 3 2 4 5 5 6 7
p3: 4 5 3 3   
p4: 5 3 3 2 1 2 3 
...
Run Code Online (Sandbox Code Playgroud)

哪里p(0) = funct(p1,p2).

并非所有输入线都是pK如此len(pk) <= len(p0).

现在我知道如何通过每条线的Shannon熵来计算每个属性的熵.我需要从这里计算互信息.

I(p0,pK)由于长度不同,互信息的联合熵的计算被卡住.

我正在计算这样一个元素的熵:

def entropy(x):
    probs = [np.mean(x == c) for c in set(x)]
    return np.sum(-p * np.log2(p) for p in probs)
Run Code Online (Sandbox Code Playgroud)

那么,对于关节我需要用来product生成输入数组xzip(p0,pk)不是使用set(x)

Bar*_*zKP 7

我假设你要计算每个之间的相互信息p1和每一个p2,p3...随后.

1)H(X)从p1 计算为熵:

公式1

每个x都是来自的后续元素p1.

2)用相同的方程计算H(Y)pK,每个x都是来自的后续元素p1

3)创建一个新的对集合p1pK:

pairs = zip(p1, pK)
Run Code Online (Sandbox Code Playgroud)

请注意,如果数据列中的值具有不同的含义,则应该填充缺失的数据(例如,使用0s或上一次迭代中的值).

4)H(X,Y)使用以下方法计算联合熵:

公式2

请注意,您不能只使用第一个等式并将每对作为单个元素处理 - 您必须在此等式之间p1和之间迭代整个笛卡尔积pK,使用pairs集合计算概率.因此,迭代整个笛卡尔产品使用for xy in itertools.product(p1, pK): ....

5)然后你就可以有之间的互信息p1,并pK为:

公式3

使用numpy的能力,提出你可以计算联合熵这里:

def entropy(X, Y):
    probs = []
    for c1 in set(X):
        for c2 in set(Y):
            probs.append(np.mean(np.logical_and(X == c1, Y == c2)))

    return np.sum(-p * np.log2(p) for p in probs if p > 0)
Run Code Online (Sandbox Code Playgroud)

在哪里if p > 0熵的定义一致:

在某些i 的p(x i)= 0 的情况下,相应的加数0 log b(0)的值被取为0

如果你不想使用numpy,那么没有它的版本可能看起来像:

def entropyPart(p):
    if not p:
        return 0

    return -p * math.log(p)

def entropy(X, Y):
    pairs = zip(X, Y)
    probs = []
    for pair in itertools.product(X,Y):
        probs.append(1.0 * sum([p == pair for p in pairs]) / len(pairs))

   return sum([entropyPart(p) for p in probs])
Run Code Online (Sandbox Code Playgroud)