从多元正态分布采样并L2归一化向量的代码问题排查
问题解决:多元正态分布采样后的L2范数归一化错误
问题背景
需要从均值向量为$\boldsymbol{0}$、协方差矩阵为单位矩阵$I_n$的多元正态分布中采样$m=10$个$n=1000$维的向量,并对每个向量进行L2范数归一化(即单个向量的元素平方和为1)。但现有代码的归一化逻辑错误,导致结果不符合预期。
错误原因分析
现有代码存在两个核心问题:
- 采样维度混淆:
np.random.multivariate_normal的参数使用错误,原代码生成的是$n$个$m$维向量,而非需求的$m$个$n$维向量。 - 归一化轴选择错误:使用
axis=0计算范数,是对每一列(特征维度)做归一化,而非对每个样本向量(行)做L2归一化。
修正后的代码
import numpy as np # 参数设置:m个n维向量 m = 10 n = 1000 # 固定随机种子保证可复现 np.random.seed(1000001) # 采样m个n维多元正态分布向量,形状为(m, n) x = np.random.multivariate_normal(np.zeros(n), np.eye(n), size=m) # 对每个行向量(单个样本)计算L2范数,keepdims保持维度匹配 vector_norms = np.linalg.norm(x, axis=1, keepdims=True) # L2归一化:每个向量除以自身的L2范数 normalized_x = x / vector_norms # 验证:打印第一个归一化向量的平方和(应接近1) print("第一个归一化向量的平方和:", np.sum(normalized_x[0] ** 2))
关键说明
- 采样维度修正:
np.random.multivariate_normal(np.zeros(n), np.eye(n), size=m)中,np.zeros(n)是n维的均值向量,np.eye(n)是n×n的单位协方差矩阵,size=m指定生成m个这样的样本,最终x的形状为$(m, n)$,每行对应一个n维向量。 - 归一化轴修正:
axis=1指定对每行(单个样本向量)计算L2范数,keepdims=True保证范数数组的形状为$(m, 1)$,这样和$(m, n)$的x做除法时会自动广播,实现每个向量除以自身的范数。 - 浮点误差:由于数值计算的浮点精度限制,平方和可能会非常接近1(如
0.9999999999999998),这是正常现象。
内容的提问来源于stack exchange,提问作者oliver
相关产品推荐
相关产品推荐

