You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从多元正态分布采样并L2归一化向量的代码问题排查

问题解决:多元正态分布采样后的L2范数归一化错误

问题背景

需要从均值向量为$\boldsymbol{0}$、协方差矩阵为单位矩阵$I_n$的多元正态分布中采样$m=10$个$n=1000$维的向量,并对每个向量进行L2范数归一化(即单个向量的元素平方和为1)。但现有代码的归一化逻辑错误,导致结果不符合预期。

错误原因分析

现有代码存在两个核心问题:

  1. 采样维度混淆:np.random.multivariate_normal的参数使用错误,原代码生成的是$n$个$m$维向量,而非需求的$m$个$n$维向量。
  2. 归一化轴选择错误:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:01:15