scipy проводной вывод scipy.stats.truncnorm

Я использую scipy версию случайной генерации для усеченного нормального распределения:

из scipy.stats импортировать truncnorm; truncnorm.rvs(8.26,1e10)

если я попытаюсь несколько раз, предполагаемая случайная генерация зависнет до 1,7976931348623157e+308, что неверно...

Может ли кто-нибудь помочь мне понять, что здесь произошло?

Спасибо


person dragonxlwang    schedule 17.01.2014    source источник
comment
Не могли бы вы опубликовать пример кода, который ясно показывает проблему?   -  person Hannes Ovrén    schedule 17.01.2014


Ответы (1)


truncnorm использует ppf (обратная функция cdf) для преобразования случайной величины.

Похоже, что способ расчета ppf не работает, когда диапазон так далеко в хвосте.

>>> truncnorm._ppf(np.linspace(0, 1, 11), 8.26,1e10)
array([ 8.20953615,  8.20953615,         inf,  8.20953615,  8.20953615,
               inf,         inf,         inf,         inf,         inf,
               inf])

Проблема в том, что оба значения для усечения находятся далеко в хвосте нормального распределения, так что мы, по сути, работаем только с проблемами округления 1 минус округление. Это ограничение с плавающей запятой, что у нас нет более высокой точности, чем двойная, например 1-1e-20 == 1.

>>> stats.norm.cdf(8.26)
0.99999999999999989

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

>>> -truncnorm.rvs(-1e10, -8.26,size=10)
array([ 8.8359488 ,  8.3112093 ,  8.36978251,  8.5732518 ,  8.57420297,
        8.27919164,  8.5692663 ,  8.28482223,  8.35149422,  8.47994703])
person Josef    schedule 17.01.2014