在python中实现Theil不等式索引

时间:2013-11-29 06:10:28

标签: python entropy inequality

我正在尝试在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

有没有办法摆脱这个问题?

1 个答案:

答案 0 :(得分:1)

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

enter image description here

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

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

如果您直接实施香农公式,则同样适用:

enter image description here

在第一种和第二种形式中,如果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