我正在使用 scipy 版本的随机生成来截断正态分布:
从 scipy.stats 导入 truncnorm;truncnorm.rvs(8.26,1e10)
如果我多次尝试,假设的随机生成将冻结到 1.7976931348623157e+308,这是错误的......
谁能帮我理解这里发生了什么?
谢谢
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])