如何生成第i分量方差为1/i的d维n个零期望高斯样本矩阵
实现原理
零均值独立高斯变量的方差可以通过缩放调整:若X服从标准正态分布(均值0、方差1),那么a*X服从均值0、方差为a²的正态分布。你要求第i个分量的方差为1/i,因此只需要将对应维度的标准正态样本乘以1/√i即可,逐分量缩放不会破坏变量间的独立性,完全符合你的需求。
实现步骤
- 使用
rng.standard_normal(size=(n, d))生成形状为(n,d)的标准正态样本矩阵,此时所有分量均为独立的标准正态分布 - 生成长度为d的缩放系数数组,1-based索引的第i个位置对应值为
1/√i,Python中可以用1 / np.sqrt(np.arange(1, d+1))直接生成 - 利用numpy的广播机制,将标准正态矩阵和缩放系数数组直接相乘,即可自动按列完成缩放
- 返回最终的样本矩阵即可
可运行代码示例
import numpy as np def generate_gaussian_samples(n: int, d: int, seed: int = None): # 初始化随机数生成器,指定seed可固定结果方便复现 rng = np.random.default_rng(seed) # 生成标准正态样本 std_samples = rng.standard_normal(size=(n, d)) # 生成各维度缩放系数 scale_arr = 1 / np.sqrt(np.arange(1, d + 1, dtype=np.float64)) # 按列缩放得到目标样本 return std_samples * scale_arr
结果验证
你可以用以下代码验证生成的样本是否符合要求:
# 生成10万样本、5维测试,样本量越大统计结果越接近理论值 test_samples = generate_gaussian_samples(n=100000, d=5, seed=42) print("各维度均值(理论值全为0):", test_samples.mean(axis=0).round(4)) print("各维度方差(理论值为1, 0.5, 0.3333, 0.25, 0.2):", test_samples.var(axis=0).round(4))
内容的提问来源于stack exchange,提问作者coolcool
相关产品推荐
相关产品推荐

