リスト内の収益の不平等を測定するために、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
この問題から抜け出す方法はありますか?