В Python небольшие поплавки стремятся к нулю - PullRequest
22 голосов
/ 14 сентября 2010

У меня есть байесовский классификатор, запрограммированный на Python, проблема в том, что когда я умножаю вероятности функций, я получаю ОЧЕНЬ маленькие значения с плавающей точкой, такие как 2.5e-320 или что-то в этом роде, и внезапно он превращается в 0.0. Значение 0.0, очевидно, бесполезно для меня, так как я должен найти «лучший» класс, основанный на том, какой класс возвращает значение MAX (большее значение).

Как лучше всего с этим справиться? Я думал о том, чтобы найти экспоненциальную часть числа (-320) и, если она окажется слишком низкой, умножить значение на 1e20 или какое-то подобное значение. Но, может быть, есть лучший способ?

Ответы [ 4 ]

24 голосов
/ 14 сентября 2010

То, что вы описываете, является стандартной проблемой с наивным байесовским классификатором.Вы можете искать недоделку с этим, чтобы найти ответ.или см. здесь .

Короткий ответ - это стандартное выражение всего этого в виде логарифмов .Поэтому вместо умножения вероятностей вы суммируете их логарифмы.

Возможно, вы захотите взглянуть и на другие алгоритмы для классификации.

17 голосов
/ 14 сентября 2010

Можно ли будет выполнять вашу работу в логарифмическом пространстве? (Например, вместо хранения 1e-320 просто сохраните -320 и используйте сложение вместо умножения)

7 голосов
/ 14 сентября 2010

Число с плавающей точкой числа не имеют бесконечной точности, поэтому вы видели, что числа превращаются в 0. Не могли бы вы умножить все вероятности на большой скаляр, чтобы ваши числа оставались в более высоком диапазоне?Если вы беспокоитесь только о максимуме, а не о величине, вам даже не нужно беспокоиться о разделении в конце.В качестве альтернативы вы можете использовать десятичную бесконечную точность, как предлагает Иканобори.

4 голосов
/ 14 сентября 2010

Взгляните на Десятичное число из stdlib.

from decimal import Decimal, getcontext

getcontext().prec = 320

Decimal(1) / Decimal(7)

Я не публикую здесь результаты, так как они довольно длинные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...