Scipy.stats.truncnorm的scipy有线输出

时间:2014-01-17 08:40:50

标签: python scipy truncated

我使用scipy版本的随机生成来截断正态分布:

来自scipy.stats import truncnorm; truncnorm.rvs(8.26,1e10)

如果我多次尝试,假定的随机生成会冻结到1.7976931348623157e + 308,这是错误的......

有谁能帮我理解这里发生的事情?

由于

1 个答案:

答案 0 :(得分: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减去舍入问题。 这是一个浮点限制,我们没有精度高于double,例如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])