如何仅使用标准正态随机值生成器生成多元正态分布?
多元正态分布正确实现方案
核心实现逻辑基于Cholesky分解,你的思路方向是对的,问题出在矩阵乘法的顺序和Cholesky分解结果的匹配上。numpy的np.linalg.cholesky返回的是下三角矩阵$L$,满足 $L @ L^T = 目标协方差矩阵$,你原有写法中直接用行向量格式的标准正态值点乘$L$,得到的协方差为$L^T @ L$,和目标协方差不符,所以生成结果不符合要求。
正确的实现代码如下(全程未使用numpy/scipy内置随机生成器,仅依赖你自定义的norm()标准正态随机值生成函数):
import numpy as np # 目标分布参数 mu = np.array([1, 2]) cov = np.array([ [1, 2], [2, 5] ]) # Cholesky分解得到下三角矩阵L L = np.linalg.cholesky(cov) # 生成40组2维独立标准正态样本 sample_count = 40 z = np.array([[norm() for _ in range(2)] for _ in range(sample_count)]) # 转换为目标多元正态样本 target_samples = z @ L.T + mu
你可以通过如下代码验证生成结果的正确性,样本量足够大时,生成样本的协方差会和目标协方差基本一致:
print("生成样本协方差:") print(np.cov(target_samples.T)) print("目标协方差:") print(cov)
如果偏好列存储样本的写法,也可以使用如下等价实现:
# 按列存储40组2维标准正态样本 z_col = np.array([ [norm() for _ in range(sample_count)], [norm() for _ in range(sample_count)] ]) target_samples = (L @ z_col).T + mu
内容的提问来源于stack exchange,提问作者ElonMuskofBadIdeas
相关产品推荐
相关产品推荐

