如何用SymPy符号化表示随机变量的随机和并计算期望与方差?
在SymPy中构造复合随机变量并计算期望与方差
核心思路
SymPy目前没有直接创建这类复合随机变量($Y = \sum_{i=1}^{N} X_i$,其中$N$是离散随机变量,$X_i$独立同分布于$X$)的内置函数,但可以利用复合分布的经典公式,结合SymPy的符号计算能力验证手动结果:
- 期望公式:$E[Y] = E[N] \cdot E[X]$
- 方差公式:$\text{Var}(Y) = E[N] \cdot \text{Var}(X) + (E[X])^2 \cdot \text{Var}(N)$
代码实现步骤
1. 导入库并定义随机变量
注意:SymPy的Geometric分布默认建模"首次成功前的失败次数"(取值0,1,2,...),如果你的$N$是"首次成功的试验次数"(取值1,2,...),需要指定succ=1参数:
from sympy import stats, S, simplify, Sum, symbols # 定义随机变量:N为几何分布,X为标准正态分布 N = stats.Geometric(name='N', p=S.One/2, succ=1) # succ=1让N从1开始取值 X = stats.Normal(name='X', mu=0, sigma=1)
2. 计算单个变量的期望与方差
# 计算各基础变量的期望和方差 E_N = stats.E(N) Var_N = stats.variance(N) E_X = stats.E(X) Var_X = stats.variance(X) print(f"E(N): {E_N}") print(f"Var(N): {Var_N}") print(f"E(X): {E_X}") print(f"Var(X): {Var_X}")
3. 用复合分布公式计算Y的期望与方差
# 代入公式计算复合变量Y的期望和方差 E_Y = E_N * E_X Var_Y = E_N * Var_X + (E_X)**2 * Var_N print(f"\nE(Y): {simplify(E_Y)}") print(f"Var(Y): {simplify(Var_Y)}")
4. 用符号求和验证期望(可选)
通过离散分布的期望定义直接求和,验证公式结果:
k = symbols('k', integer=True, positive=True) p = S.One/2 # 对应succ=1时N=k的概率:P(N=k) = p*(1-p)^(k-1) prob_N_k = p * (1 - p)**(k - 1) # 计算E[Y] = sum_{k=1}^∞ E[Y|N=k] * P(N=k) = sum_{k=1}^∞ k*E[X]*P(N=k) E_Y_sum = simplify(Sum(k * E_X * prob_N_k, (k, 1, S.Infinity))) print(f"\nE(Y) 符号求和验证: {E_Y_sum}")
结果说明
对于示例中的参数:
- $N$是succ=1的几何分布($p=1/2$),$E[N]=2$,$\text{Var}(N)=2$
- $X$是标准正态分布,$E[X]=0$,$\text{Var}(X)=1$
- 代入公式得$E(Y)=0$,$\text{Var}(Y)=21 + 0^22=2$,和符号求和结果完全一致。
内容的提问来源于stack exchange,提问作者Josh Hernandez
相关产品推荐
相关产品推荐

