我试图在渐近上添加两个泊松随机变量。但我的计算没有反应。
有什么可以回答的吗?
import sympy as sp
import sympy.stats as ss
x= ss.Poisson("x", 3)
y = ss.Poisson("y", 6)
mixed = x+y
d = ss.density(mixed)
print(sp.N(d(0)))
发布于 2022-07-06 02:46:11
有两件事减缓了评估的速度:
如果您查看这个表达式,您将看到它包含一个从0到无穷远的求和。计算永远不会停止!
我将这样做:用符号替换无穷大,用lambdify
生成函数并对其进行计算。
import sympy as sp
import sympy.stats as ss
x= ss.Poisson("x", 3)
y = ss.Poisson("y", 6)
mixed = x+y
d = ss.density(mixed)
# substitute infinity with a symbol
n = sp.symbols("n")
expr = d(0).subs(sp.oo, n)
# generate a function to be evaluate with Numpy/Scipy
f = sp.lambdify([n], expr)
# evaluate the function: provide a relatively high value of `n`
print(f(100))
# out: 0.00012340980408667956
如果您选择n
太大,您将得到以下错误(因为阶乘),例如:
print(f(400))
# OverflowError: int too large to convert to float
发布于 2022-07-06 03:45:27
在这种情况下,您有一个无穷和,但只有第一个项是非零的:
In [25]: d(0)
Out[25]:
∞
______
╲
╲
╲ ⎧ -y y -9
╲ ⎪3 ⋅6 ⋅ℯ
╲ ⎪────────── for y ≤ 0
╱ ⎨ (-y)!⋅y!
╱ ⎪
╱ ⎪ 0 otherwise
╱ ⎩
╱
‾‾‾‾‾‾
y = 0
理想情况下,SymPy只能计算这一点,但它似乎没有显式的处理程序,可以在像这样的Piecewise上进行求和。
因此,我们只需评估第一任期:
In [29]: d(0).args[0].subs(y.symbol, 0)
Out[29]:
-9
ℯ
这相当于问x和y都为0的概率:
In [30]: ss.density(x)(0) * ss.density(y)(0)
Out[30]:
-9
ℯ
In [31]: ss.P(Eq(x, 0) & Eq(y, 0))
Out[31]:
-9
ℯ
In [32]: N(_)
Out[32]: 0.000123409804086680
https://stackoverflow.com/questions/72877740
复制相似问题