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

4
我希望能够使用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个回答

2
那么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


啊哈!感谢您关于有理数的提示! - Scott Staniewicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接