4

我正在尝试在 Python 中实现 Theil 的索引(http://en.wikipedia.org/wiki/Theil_index)来衡量列表中收入的不平等。

该公式基本上是香农的熵,所以它处理对数。我的问题是我的列表中有一些收入为 0,而 log(0) 使我的公式不满意。我相信将一个微小的浮点数添加到 0 不会像 log(tinyFloat) = -inf 那样工作,这会弄乱我的索引。

[编辑] 这是一个片段(取自另一个更简洁的 - 并且免费提供 - 实现)

    def error_if_not_in_range01(value):
        if (value <= 0) or (value > 1):
            raise Exception, \
                str(value) + ' is not in [0,1)!'
    def H(x)
        n = len(x)
        entropy = 0.0
        sum = 0.0
        for x_i in x: # work on all x[i]
            print x_i
            error_if_not_in_range01(x_i)
            sum += x_i
            group_negentropy = x_i*log(x_i)
            entropy += group_negentropy
        error_if_not_1(sum)
        return -entropy
    def T(x):
        print x
        n = len(x)
        maximum_entropy = log(n)
        actual_entropy = H(x)
        redundancy = maximum_entropy - actual_entropy
        inequality = 1 - exp(-redundancy)
        return redundancy,inequality

有没有办法解决这个问题?

4

1 回答 1

3

如果我理解正确,您尝试实现的公式如下:

在此处输入图像描述

在这种情况下,您的问题是计算Xi / mean(X)时的自然对数Xi = 0

但是,由于必须先乘以Xi / mean(X),如果Xi == 0的值ln(Xi / mean(X))无关紧要,因为它将乘以零。您可以将该条目的公式值视为零,并完全跳过计算对数。

在您直接实施香农公式的情况下,同样适用:

在此处输入图像描述

在第一种和第二种形式中,如果 ,则不需要计算对数Pi == 0,因为无论它是什么值,都将乘以零。

更新:

鉴于您引用的代码,您可以用x_i*log(x_i)如下函数替换:

def Group_negentropy(x_i):
    if x_i == 0:
        return 0
    else:
        return x_i*log(x_i)

def H(x)
    n = len(x)
    entropy = 0.0
    sum = 0.0
    for x_i in x: # work on all x[i]
        print x_i
        error_if_not_in_range01(x_i)
        sum += x_i
        group_negentropy = Group_negentropy(x_i)
        entropy += group_negentropy
    error_if_not_1(sum)
    return -entropy
于 2013-11-29T07:26:52.523 回答