(这个Q here)的要点
我想创建两个Gamma分布的混合并绘制结果,在给定范围内进行评估。
似乎sympy.stats能够做到这一点,因为它能够计算出混合物和样品的期望值。我很陌生,所以不确定在这种情况下评估和策划的首选方式是否比我一直使用的更好。
%matplotlib inline
from matplotlib import pyplot as plt
from sympy.stats import Gamma, E, density
import numpy as np
G1 = Gamma("G1", 5, 2.5)
G2 = Gamma("G2", 4, 1.5)
f1 = 0.7; f2 = 1-f1
G3 = f1*G1 + f2*G2
期望给了我所有3个单一的合理数字
In [19]: E(G1)
Out[19]: 12.5000000000000
In [20]: E(G2)
Out[20]: 6.00000000000000
In [21]: E(G3)
Out[21]: 10.5500000000000
......但是在混合物上绘图失败
u = np.linspace(0, 50)
D1 = density(G1); D2 = density(G2); D3 = density(G3)
v1 = [D1.args[1].subs(D1.args[0][0], i).evalf() for i in u]
v2 = [D2.args[1].subs(D2.args[0][0], i).evalf() for i in u]
v3 = [D3.args[1].subs(D3.args[0][0], i).evalf() for i in u]
plt.plot(u, v1)
plt.plot(u, v2)
plt.plot(u, v3) # this one fails with error 'can't convert expression to float'
问题似乎是混合术语仍包含自由符号
In [44]: v1[0].free_symbols
Out[44]: set()
In [45]: v3[0].free_symbols
Out[45]: {x}
...正如我所说,sympy.stats似乎在计算期望时以某种方式处理这个问题,我想。所以我认为我需要在评估和绘制混合物分布(?)
时应用这些机器答案 0 :(得分:1)
看起来这是固定的。我可以在SymPy 0.7.3中重现你的错误,但它在0.7.4.1(最新版本)中运行正常。
首先,你不需要与.args
混淆。 density
返回的表达式是可调用的。只需致电D1(i).evalf()
即可获得D1
i
的数值,例如
D1 = density(G1); D2 = density(G2); D3 = density(G3)
v1 = [D1(i).evalf() for i in u]
v2 = [D2(i).evalf() for i in u]
v3 = [D3(i).evalf() for i in u]
我已将工作版本上传到http://nbviewer.ipython.org/gist/asmeurer/8486176。