4

リスト内の収益の不平等を測定するために、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

この問題から抜け出す方法はありますか?

4

1 に答える 1

3

私があなたを正しく理解していれば、あなたが実装しようとしている式は次のとおりです。

ここに画像の説明を入力

この場合、問題は の自然対数を計算することXi / mean(X)ですXi = 0

ただし、Xi / mean(X)最初に乗算する必要があるため、ゼロが乗算されるXi == 0ため、 の値はln(Xi / mean(X))問題ではありません。そのエントリの式の値をゼロとして扱い、対数の計算を完全にスキップできます。

シャノンの式を直接実装している場合、同じことが当てはまります。

ここに画像の説明を入力

最初の形式と 2 番目の形式の両方で、 の場合、対数を計算する必要はありませんPi == 0。これは、値が何であれ、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
于 2013-11-29T07:26:52.523 に答える