用SymPy求正态分布CDF时的误差

2024-09-28 19:06:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用正态分布来做一些符号计算。在

from sympy.stats import Normal, cdf
from scipy.stats import norm

norm.cdf(10, 10, 0.1)

def survival(x):
    y = Normal("x", 10, 0.1)
    return cdf(y)(x)

survival(10)

此代码产生以下错误:

^{pr2}$

值得注意的是,通过以下调整,它似乎起到了作用:

return cdf(y, meijerg=False)(x)

有人能解释一下这种行为吗?在


Tags: 代码fromimportnormreturndefstats错误
1条回答
网友
1楼 · 发布于 2024-09-28 19:06:48

一般要点:

  1. SymPy stats模块还有一些改进空间。特别是,文档承认为普通随机变量返回的CDF“需要一些来自simplify的帮助”才能变得可用。在
  2. 浮点数,特别是在二进制系统中不能精确表示的浮点数,是SymPy的毒药。您认为您传递的是0.1,但它实际上是3602879701896397/36028797018963968,符号集成例程正在进行匹配。在

关于第一点,下面的例子说明cdf(x)(t)是一个危险的命题。在

>>> x = Normal('x', 1, 1)
>>> cdf(x)(1)
nan

问题是未简化的cdf被_z-1除法。更好的方法:

^{pr2}$

关于第二个问题:由于CDF是通过符号积分来计算的,传递浮点数作为参数会使积分器的寿命变得非常困难,以至于它使用Meijer G函数进行积分时会遇到一些隐藏的缺陷。使用Rational(1, 10)或{}创建一个有理数1/10,而不是十进制0.1。在

>>> from sympy import S
>>> x = Normal("x", 10, S(1)/10)
>>> simplify(cdf(x))(10)
1/2

相关问题 更多 >