В Python небольшие поплавки, стремящиеся к нулю
У меня есть байесовский классификатор, запрограммированный в Python, проблема в том, что когда я умножаю вероятности функций, я получаю ОЧЕНЬ маленькие значения float, такие как 2.5e-320 или что-то в этом роде, и вдруг он превращается в 0.0. 0.0, очевидно, бесполезен для меня, так как я должен найти "лучший" класс, на основе которого класс возвращает значение MAX (большее значение).
Каким будет лучший способ справиться с этим? Я подумал о том, чтобы найти экспоненциальную часть числа (-320) и, если она идет слишком низко, умножая значение на 1e20 или некоторое значение, подобное этому. Но, может быть, есть лучший способ?
Ответы
Ответ 1
То, что вы описываете, является стандартной проблемой с наивным классификатором Байеса. Вы можете найти нижний поток с этим, чтобы найти ответ. или см. здесь.
Короткий ответ заключается в том, что стандартно выражать все это в терминах логарифмов. Поэтому вместо того, чтобы умножать вероятности, вы суммируете их логарифмы.
Возможно, вы захотите посмотреть и на другие алгоритмы классификации.
Ответ 2
Можно ли выполнить вашу работу в логарифмическом пространстве? (Например, вместо сохранения 1e-320
просто сохраните -320
и используйте дополнение вместо умножения)
Ответ 3
Числа с плавающей запятой не имеют бесконечной точности, поэтому вы видели, что числа обращаются в 0. Не могли бы вы умножить все вероятности на большой скаляр, чтобы ваши номера оставались в более высоком диапазоне? Если вас беспокоит только макс, а не величина, вам даже не нужно беспокоиться о том, чтобы пробиться в конце. В качестве альтернативы вы можете использовать бесконечную десятичную десятичную точность, например, предлагает ikanobori.
Ответ 4
Взгляните на Decimal из stdlib.
from decimal import Decimal, getcontext
getcontext().prec = 320
Decimal(1) / Decimal(7)
Я не размещаю результаты здесь, поскольку он довольно длинный.