在python中实现Theil不等式索引

2024-06-16 11:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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

有办法解决这个问题吗?在


Tags: inlog列表lenifvaluedefnot
1条回答
网友
1楼 · 发布于 2024-06-16 11:22:52

如果我没弄错的话,你要实现的公式如下:

enter image description here

在本例中,您的问题是计算Xi / mean(X)的自然对数,当Xi = 0时。在

但是,因为它必须首先乘以Xi / mean(X),如果Xi == 0的值{}并不重要,因为它将被乘以零。您可以将该项的公式值视为零,并完全跳过对数的计算。在

如果你直接执行香农公式,同样适用:

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

相关问题 更多 >