在SymPy中,为什么将2个随机变量相加会产生难以理解的结果?

时间:2018-07-03 09:10:02

标签: python statistics sympy

考虑SymPy中2个高斯变量的总和:

from sympy import *
from sympy.stats import *

init_printing()

a = Normal('a', 0, Symbol('P', real=true))
b = Normal('b', 0, Symbol('Q', real=true))

ss = a + b

pprint(simplify(density(ss)))

我希望结果是具有更高方差的高斯PDF。相反,结果看起来像这样:

    ⎧    ⎛               2  2                                                 
    ⎪    ⎜              z ⋅P                                                  
    ⎪    ⎜         ───────────────                                            
    ⎪    ⎜              ⎛  2     ⎞                                            
    ⎪    ⎜            4 ⎜ P     1⎟                                            
    ⎪    ⎜         4⋅Q ⋅⎜──── + ─⎟                                            
    ⎪    ⎜              ⎜   2   2⎟                                           2
    ⎪    ⎜              ⎝2⋅Q     ⎠    ⎛         z⋅P         ⎞               z 
    ⎪    ⎜  z⋅π⋅P⋅ℯ               ⋅erf⎜─────────────────────⎟          ───────
    ⎪    ⎜                            ⎜           __________⎟               ⎛ 
    ⎪    ⎜                            ⎜          ╱   2      ⎟             4 ⎜ 
    ⎪    ⎜                            ⎜   2     ╱   P     1 ⎟          4⋅Q ⋅⎜─
    ⎪    ⎜                            ⎜2⋅Q ⋅   ╱   ──── + ─ ⎟               ⎜ 
    ⎪    ⎜                            ⎜       ╱       2   2 ⎟               ⎝2
    ⎪    ⎜                            ⎝     ╲╱     2⋅Q      ⎠   z⋅π⋅P⋅ℯ       
    ⎪  Q⋅⎜- ───────────────────────────────────────────────── - ──────────────
    ⎪    ⎜                           __________                            ___
    ⎪    ⎜                          ╱   2                                 ╱   
    ⎪    ⎜                   2     ╱   P     1                     2     ╱   P
z ↦ ⎨    ⎜                2⋅Q ⋅   ╱   ──── + ─                  2⋅Q ⋅   ╱   ──
    ⎪    ⎜                       ╱       2   2                         ╱      
    ⎪    ⎝                     ╲╱     2⋅Q                            ╲╱     2⋅
    ⎪- ───────────────────────────────────────────────────────────────────────
    ⎪                                             3/2                         
    ⎪                                        2⋅z⋅π   ⋅P                       
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎪                                                                         
    ⎩                                                                         
... (426 lines in total)                                         

                         ⎞                                             ⎞
 ⎛      1          ⎞│   π⎟   │                 ⎛      1          ⎞│   π⎟
t⎜──────────────, ∞⎟│ < ─⎟ ∨ │periodic_argument⎜──────────────, ∞⎟│ < ─⎟
 ⎜          2      ⎟│   2⎟   │                 ⎜          2      ⎟│   2⎟
 ⎝polar_lift (P)   ⎠│    ⎠   │                 ⎝polar_lift (P)   ⎠│    ⎠

为什么SymPy给出了这样一个奇怪的结果,我应该怎么做才能得到简洁的表格?

1 个答案:

答案 0 :(得分:2)

将第二个参数(标准偏差,“ sigma”)声明为正值:

a = Normal('a', 0, Symbol('P', positive=True))
b = Normal('b', 0, Symbol('Q', positive=True))

然后结果如预期:

               2     
             -z      
         ─────────── 
            2      2 
         2⋅P  + 2⋅Q  
     √2⋅ℯ            
z ↦ ─────────────────
            _________
           ╱  2    2 
    2⋅√π⋅╲╱  P  + Q  

在引擎盖下,SymPy使用Meijer G函数计算不正确的积分,这涉及将计算提升到某些Riemann曲面,并且P或Q的值为负数会导致另一个分支。因此答案很复杂。从数学上来说,这对计算没有太大影响,因为sigma是指数的平方。但这对于算法的成功至关重要。

如果SymPy只知道独立法线是如何添加的,那么所有这些都将是没有意义的,但事实并非如此。所有这些计算都是通过直接积分完成的,通常会扩展已实现的积分方法的局限性。

备注:

  1. 您使用过true(SymPy真实对象),但是符号创建方法需要使用Python的True
  2. 最好避免合并from sympy import *from sympy.stats import *,因为这会导致命名冲突:E是SymPy 中的Euler数,中的期望值表示法sympy.stats。