绘制SymPy中两个随机变量之和的密度

时间:2017-10-25 01:12:12

标签: python plot sympy

我想用sympy制作并绘制混合随机变量。

我有两个均匀加权的正态分布的高斯混合,一个平均值为1,另一个平均值为2.

from sympy.stats import Normal
mixed = 0.5 * Normal('n1', 1, 1) + 0.5 * Normal('n2', 2, 1)
E(mixed1)

Out: 1.5

这是正确的,但我无法绘制这个分布:

x = symbols('x'
sp.plot(mixed(x), x)

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-a1c8047b8c4a> in <module>()
----> sp.plot(mixed(x), x)

TypeError: 'Add' object is not callable

当我尝试将其设为密度时,我得到一个以

结尾的长错误
sp.plot(density(mixed1)(x), x)
...
UnboundLocalError: local variable 'reprec' referenced before assignment

关于为什么绘图功能不喜欢这里总和的任何想法?

1 个答案:

答案 0 :(得分:1)

mixed(x)发生错误是设计错误。 RandomSymbol对象不可调用(即,不能被视为函数),也不是它们的总和。绘制density(mixed)(x)是正确的方法。但是正确并不总是意味着成功。

使用参数evaluate=False,您将看到SymPy为密度设置合理的积分:

density(mixed, evaluate=False)(x)

问题在于评估它,这对你的例子来说是失败的。但这可以通过使用有理数而不是像0.5这样的浮点数来解决。

mixed = Normal('n1', 1, 1) / 2 +  Normal('n2', 2, 1) / 2

当你有理性数字时,成功整合的机会更大。事实上,以下工作:

from sympy.stats import *
mixed = Normal('n1', 1, 1) / 2 +  Normal('n2', 2, 1) / 2
x = symbols("x")
d = density(mixed)(x)

密度公式看起来很复杂,但在简化d = d.simplify()后,它正是人们所期望的:

exp(-x**2 + 3*x - 9/4)/sqrt(pi)

最后,plot(d, (x, -3, 5))给出了

plot