如何用Sympy验证独立泊松随机变量平方和平方的期望?
解决Sympy中独立泊松变量和的期望计算问题
问题出在你创建随机变量的方式:Poisson("x_i", mu)里的"x_i"是固定字符串,Sympy不会把字符串里的符号i解析成循环变量,所以所有求和项都被当成同一个随机变量,展开后自然得到n²·x_i⁴。
要正确生成n个独立的泊松随机变量,有两种可行方法:
方法一:使用IndexedBase创建随机变量序列
利用sympy.stats的IndexedBase和PoissonRV来定义独立的随机变量序列,这样每个x[i]都是独立的泊松变量:
import sympy as sy from sympy.stats import PoissonRV, E, IndexedBase # 定义符号 n = sy.Symbol("n", integer=True, positive=True) mu = sy.Symbol("mu", positive=True) i = sy.Symbol("i", integer=True) # 创建独立的泊松随机变量序列 x = IndexedBase("x") x_i = PoissonRV(x[i], mu) # 每个x[i]都是参数为mu的独立泊松变量 # 构造y并计算期望 sum_x2 = sy.Sum(x_i**2, (i, 0, n-1)) y = sum_x2**2 E_y = E(y).simplify() # 手动展开理论表达式对比 E_x2 = E(x_i**2) E_x4 = E(x_i**4) theoretical_Ey = n * E_x4 + n*(n-1) * E_x2**2 # 验证是否相等 print(sy.simplify(E_y - theoretical_Ey) == 0) # 输出True,说明结论正确
方法二:通过循环生成独立随机变量
如果更直观,也可以用循环逐个生成独立的随机变量,再求和:
import sympy as sy from sympy.stats import Poisson, E n = sy.Symbol("n", integer=True, positive=True) mu = sy.Symbol("mu", positive=True) # 生成n个独立的泊松随机变量 x_list = [Poisson(f"x_{k}", mu) for k in range(n)] # 构造y并计算期望 sum_x2 = sum([x**2 for x in x_list]) y = sum_x2**2 E_y = E(y).simplify() # 理论表达式 E_x2 = E(x_list[0]**2) E_x4 = E(x_list[0]**4) theoretical_Ey = n * E_x4 + n*(n-1) * E_x2**2 print(sy.simplify(E_y - theoretical_Ey) == 0) # 输出True
两种方法都能正确识别每个x_i是独立变量,展开平方和后会得到交叉项,计算期望时利用独立变量的协方差为0,最终结果和理论公式一致。
内容的提问来源于stack exchange,提问作者WhyNoPython
相关产品推荐
相关产品推荐

