You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sympy中两个泊松随机变量求和计算极慢无响应如何解决

问题复现

在Sympy中执行两个泊松随机变量的求和及密度计算时,程序长时间无响应无法输出结果,复现代码如下:

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)))
故障原因

Sympy的stats模块计算离散随机变量和的密度时,默认走通用卷积逻辑,会尝试遍历整数域所有可能的取值组合做累加,没有内置独立泊松变量求和的专用分布推导规则。泊松分布的取值范围是所有非负整数,属于无限支撑集,触发无限域求和后程序就会挂死,不会返回结果。

解决方法

方法1:利用泊松分布可加性直接构造结果

独立泊松变量天然满足可加性:两个参数为λ₁、λ₂的独立泊松变量之和,仍然服从泊松分布,新分布的参数为λ₁+λ₂。直接手动构造求和后的分布变量即可,不需要走通用卷积流程,计算效率最高:

import sympy as sp
import sympy.stats as ss
x = ss.Poisson("x", 3)
y = ss.Poisson("y", 6)
# 直接构造和的分布,参数为两个原分布参数之和
mixed = ss.Poisson("mixed", 3 + 6)
d = ss.density(mixed)
print(sp.N(d(0)))
# 输出:1.23409804086680e-4,和理论值exp(-9)完全一致

方法2:手动限定卷积求和范围

如果不想手动套用分布性质,要保留通用计算逻辑,可以手动截断卷积的求和区间,避免程序做无限遍历。比如计算P(x+y=0)时,唯一满足条件的取值组合是x=0、y=0,直接指定求和范围计算即可:

import sympy as sp
import sympy.stats as ss
x = ss.Poisson("x", 3)
y = ss.Poisson("y", 6)
k = sp.symbols('k', integer=True, nonnegative=True)
# 手动指定卷积求和的上下界,只计算需要的取值区间
p0 = sp.summation(ss.density(x)(k) * ss.density(y)(0 - k), (k, 0, 0))
print(sp.N(p0))
# 输出:1.2340980408667956e-4,结果一致
注意事项
  • 所有支撑集为无限集的离散随机变量做卷积运算时,都不要直接调用无参数的ss.density方法求值,大概率会触发无限求和导致程序挂起
  • 优先利用已知分布的运算性质构造结果,计算效率和稳定性远高于通用卷积逻辑

内容的提问来源于stack exchange,提问作者gravitydata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:06:30