我想用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
关于为什么绘图功能不喜欢这里总和的任何想法?
答案 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))
给出了