使用SymPy评估正态分布的CDF时出错

时间:2017-11-10 08:44:15

标签: python distribution sympy

我想使用SymPy正态分布,因为我用它做了一些符号计算。

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)

此代码产生以下错误:

UnboundLocalError: local variable 'reprec' referenced before assignment

值得注意的是,通过以下调整,它似乎有效:

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

有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:1)

一般要点:

  1. SymPy stats模块有一些改进空间。特别是,文件承认CDF返回正常随机变量"需要一些帮助"从simplify变得可用。
  2. 浮点数,特别是那些在二进制系统中没有精确表示的浮点数,对于SymPy来说是有害的。你认为你传的是0.1,但它真的是3602879701896397/36028797018963968,并且符号集成例程正在适应。
  3. 关于第一点;以下示例显示cdf(x)(t)是一个冒险的主张。

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

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

    >>> simplify(cdf(x))(1)
    1/2 
    

    关于第二个问题:由于CDF是通过符号集成计算的,因此将浮点数作为参数传递会使积分器的寿命变得足够困难,以至于使用Meijer G函数进行集成时会遇到一些深度隐藏的错误。使用Rational(1, 10)S(1)/10创建有理数字1/10而不是小数0.1。

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