Я занимаюсь математикой с действительно большими числами (я использую Python, но этот вопрос не относится к Python).Для одного значения у меня есть формула, которая дает мне f(t) = Pr(X < t)
.Я хочу использовать эту формулу, чтобы получить Pr(X >= t) = 1 - f(t)
.Поскольку f(t)
возвращает значения очень близкие к нулю, я использую преобразование журнала и сохраняю log( f(t) )
вместо f(t)
.Мой log( f(t) )
порядка -1e5 или около того.
Для умножения это работает довольно хорошо.log( f(t) * g ) = log( f(t) ) + log(g)
.
Но очень сложно вычислить log( 1 - f(t) )
, используя только log( f(t) )
;Я мог бы, конечно, временно возвести в степень значение, которое я храню и вычисляю log( 1 - exp( log( f(t) ) )
, но это вернет log( 1 - 0.0 ) = 0.0
, потому что log( f(t) )
так близко к нулю.
Вы можете спросить: «Почему вы заботитесь«Если оно близко к нулю, то 1 минус очень близко к 1.»Ну, это хорошая мысль, которую вы сделали.Ты умное печенье.
Проблема в том, что я хочу использовать это для ранжирования значений, поэтому мне действительно важно, если одно значение равно log(0.999)
, а другое - log(0.9999)
.Вы также можете спросить: «Ну, почему бы вам просто не оценить log( f(t) )
, а затем изменить порядок, чтобы получить рейтинг для log( 1 - f(t) )
».Опять же, я не могу не указать, насколько хороши ваши вопросы.Очень приятно было с вами пообщаться.
Но вот в чем проблема: я не хочу просто ранжироваться по 1 - f(t)
;Я на самом деле хочу ранжироваться на основе Pr(X >= t) * g(t) = (1 - f(t)) g(t)
.После взятия логов я получаю log( 1 - f(t) ) + log( g(t) )
;ранжирование, основанное только на f(t)
, не даст правильного ответа.
В прошлом я писал небольшую функцию Python для вычисления log(a + b)
из log(a)
и log(b)
:
def log_add(logA,logB):
if logA == log(0):
return logB
if logA<logB:
return log_add(logB,logA)
return log( 1 + math.exp(logB-logA) ) + logA
Это помогает сначала нормализовать их так, чтобы они были близко друг к другу, а затем возвести в степень, когда они близко друг к другу.
К сожалению, я не смог заставить тот же трюк работать для моего вычитания, потому чтоне существует коэффициента нормализации, который бы сближал log(1)
и log( f(t) )
, потому что они так далеко друг от друга.
Кто-нибудь знает, как это решить?Это похоже на такую классическую проблему;Я действительно ожидал / надеюсь / молюсь, что есть умная функция, которая работает на битовом уровне, которая может дать мне log(1-x)
от log(x)
.Кроме того, если вы знаете , как это работает, я бы очень, очень хотел бы знать.
Ура!Оливер