如何正确对两个scipy multivariate_normal多元正态分布执行求和运算?
两个多元正态分布求和的实现方法
scipy 中 multivariate_normal 返回的是冻结分布实例,没有定义加法运算符,也不属于可迭代对象,因此直接使用 + 或者 sum() 运算都会触发类型错误。
核心原理
对于相互独立的多元正态分布,其和仍然服从多元正态分布,满足两个计算规则:
- 结果的均值向量为两个分布的均值向量逐元素相加
- 结果的协方差矩阵为两个分布的协方差矩阵逐元素相加
如果两个分布不相互独立,需要额外补充两个分布的交叉协方差矩阵,计算公式为 总协方差 = 分布0协方差 + 分布1协方差 + 交叉协方差 + 交叉协方差的转置,以下实现默认两个分布相互独立。
正确实现代码
from scipy.stats import multivariate_normal # 定义原始的两个多元正态分布 Z0 = multivariate_normal([1,2], [[2,0],[0,2]]) Z1 = multivariate_normal([1.1,2.2], [[2.1,0],[0,4.1]]) # 分别提取均值和协方差相加得到和分布的参数 sum_mean = Z0.mean + Z1.mean sum_cov = Z0.cov + Z1.cov # 生成两个分布求和后的多元正态分布 Z = multivariate_normal(sum_mean, sum_cov)
结果验证
你可以通过采样的方式验证计算结果的正确性:
import numpy as np # 各采样10000个点相加得到实际和的样本 sample_z0 = Z0.rvs(size=10000) sample_z1 = Z1.rvs(size=10000) sample_sum = sample_z0 + sample_z1 # 对比理论值和采样统计值 print("采样得到的和分布均值:", np.mean(sample_sum, axis=0)) print("理论计算的和分布均值:", sum_mean) print("采样得到的和分布协方差:\n", np.cov(sample_sum, rowvar=False)) print("理论计算的和分布协方差:\n", sum_cov)
内容的提问来源于stack exchange,提问作者user1393214
相关产品推荐
相关产品推荐

