我正在尝试在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
有没有办法摆脱这个问题?
答案 0 :(得分:1)
如果我理解正确,您尝试实施的公式如下:
在这种情况下,您的问题是在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