我试图在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
有办法解决这个问题吗?在
如果我没弄错的话,你要实现的公式如下:
在本例中,您的问题是计算
Xi / mean(X)
的自然对数,当Xi = 0
时。在但是,因为它必须首先乘以}并不重要,因为它将被乘以零。您可以将该项的公式值视为零,并完全跳过对数的计算。在
Xi / mean(X)
,如果Xi == 0
的值{如果你直接执行香农公式,同样适用:
在第一种和第二种形式中,如果
Pi == 0
,则不需要计算日志,因为无论它是什么值,它都将被零乘以。在更新:
给定您引用的代码,可以将
x_i*log(x_i)
替换为如下函数:相关问题 更多 >
编程相关推荐