2014-01-17 3 views
0

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

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

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

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

Благодаря

+0

Можете ли вы отправить примерный код, который четко показывает проблему? –

ответ

1

truncnorm использует 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 минус округлением. Это ограничение с плавающей запятой, что мы не имеем более высокую точность, чем double, например 1-1e-20 == 1.

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

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

>>> -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]) 
+0

спасибо, этот трюк использования левой стороны нормальный умный! – dragonxlwang

Смежные вопросы