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
相关产品推荐
相关产品推荐

