[英]Implementation of Theil inequality index in 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
有没有办法解决这个问题?
如果我理解正确,您尝试实现的公式如下:
在这种情况下,当Xi = 0
时,您的问题是计算Xi / mean(X)
的自然对数。
但是,由于必须首先乘以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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.