【问题标题】:Plotting the density of the sum of two random variables in SymPy在 SymPy 中绘制两个随机变量之和的密度
【发布时间】:2020-06-19 00:06:53
【问题描述】:

我想用 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

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

【问题讨论】:

    标签: python plot sympy


    【解决方案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))给了

    【讨论】:

    • 啊哈!感谢有理数的提示!
    猜你喜欢
    • 2020-09-07
    • 2021-10-07
    • 2016-05-25
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2013-10-27
    相关资源
    最近更新 更多