Функции логита и обратного логита для экстремальных значений

Мне нужны функции logit и обратного logit, чтобы logit (inv_logit ( n)) == n . Я использую numpy, и вот что у меня есть:

import numpy as np
def logit(p):
    return np.log(p) - np.log(1 - p)

def inv_logit(p):
    return np.exp(p) / (1 + np.exp(p))

И вот значения:

print logit(inv_logit(2)) 
2.0 

print logit(inv_logit(10))
10.0 

print logit(inv_logit(20))
20.000000018 #well, pretty close

print logit(inv_logit(50))
Warning: divide by zero encountered in log
inf 

Теперь давайте проверим отрицательные числа

print logit(inv_logit(-10))
-10.0 
print logit(inv_logit(-20))
-20.0 
print logit(inv_logit(-200))
-200.0 
print logit(inv_logit(-500))
-500.0 
print logit(inv_logit(-2000))
Warning: divide by zero encountered in log
-inf 

Итак, мои вопросы: как правильно реализовать эти функции, чтобы требование logit (inv_logit (n)) == n будет выполняться для любого n в максимально широком диапазоне (по крайней мере [-1e4; 1e4)?

А также (и я я уверен, что это связано с первым), почему моя функция более стабильна с отрицательными значениями по сравнению с положительными?

9
задан mskfisher 10 May 2012 в 12:38
поделиться