Реализация индекса неравенства Theil в python

Я пытаюсь внедрить индекс Theil ( http://en.wikipedia.org/wiki/Theil_index ) в Python для измерения неравенства дохода в списке.

Формула – это в основном энтропия Шеннона, поэтому она имеет дело с журналом. Моя проблема в том, что у меня есть несколько доходов в 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 

Есть ли выход из этой проблемы?

One Solution collect form web for “Реализация индекса неравенства Theil в python”

Если вы правильно поняли, формула, которую вы пытаетесь реализовать, следующая:

введите описание изображения здесь

В этом случае ваша задача заключается в вычислении натурального логарифма 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 
 
Interesting Posts for Van-Lav

столбец python pandas условно на два других значения столбца

Модуль «компилятор» py3k

копировать значения из одного кадра данных в другой фрейм данных (разная длина) путем сравнения значений строк в python

Python: как добавить строку «ub» к каждой выраженной гласной в строке?

Считываемый эквивалент C # операции кусочка Python

Измените пространства имен в заданном XML-документе с помощью lxml

Jinja2: изменение значения переменной внутри цикла

неправильный тип операнда для abs (): 'list'

Невозможная ошибка в программе, которая выравнивает богатство в группе (UVA 10137, «The Trip»)

python: шаблон поиска регулярных выражений для двоичных файлов (половина байта)

Модуль Python paramiko с использованием нескольких команд

Python numpy: см., Если массив симметричен в пределах допуска

Могу ли я использовать анимацию с виджетами Matplotlib для pyqt4?

Не удалось импортировать Tensorflow «Нет модуля с именем copyreg»

IntegrityError pysqlite: отличить «NOT NULL» от нарушения «UNIQUE»

Python - лучший язык программирования в мире.