Подтвердить что ты не робот

В Python небольшие поплавки, стремящиеся к нулю

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

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

4b9b3361

Ответ 1

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

Короткий ответ заключается в том, что стандартно выражать все это в терминах логарифмов. Поэтому вместо того, чтобы умножать вероятности, вы суммируете их логарифмы.

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

Ответ 2

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

Ответ 3

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

Ответ 4

Взгляните на Decimal из stdlib.

from decimal import Decimal, getcontext

getcontext().prec = 320

Decimal(1) / Decimal(7)

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