2015-06-15 3 views
0

Я реализую алгоритм Витерби (динамический алгоритм) в Python, и я замечаю, что для больших входных файлов вероятности продолжают умножаться и сокращаться за пределы точности с плавающей запятой. Мне нужно сохранить номера в лог-пространстве.Преобразование float в пространство журнала в python

Может ли кто-нибудь дать простой пример кода кода Python о том, как преобразовать, скажем, 0,0000003 в log-space? (Я не уверен, что это должен быть естественный журнал или какой-то другой журнал. Я только слышал о «лог-пространстве», но не знаю об этом.)

Спасибо!

+0

Не могли бы вы использовать '' decimal.Decimal() '' здесь? –

ответ

0

Чтобы перейти в пространство журнала, используйте log. Чтобы вернуться назад, используйте exp. The rules in log space are different - напр. для выполнения умножения следует добавить в logspace.

>>> from math import log, exp 
>>> log(0.0000003) 
-15.01948336229021 
>>> exp(-15.01948336229021) 
3.0000000000000015e-07 
>>> log(0.0000003) + log(0.0000003) 
-30.03896672458042 
>>> exp(-30.03896672458042) 
9.000000000000011e-14 # 0.0000003 * 0.0000003 

Вот пример использования некоторых малых вероятностей

>>> probabilities = [0.0000003, 0.0000004, 0.0000005] 
>>> exp(sum(log(p) for p in probabilities)) 
5.999999999999992e-20