一、完整语法与参数解释
np.random.normal(loc=0, scale=1, size=None) 是 NumPy 中生成「正态分布(高斯分布)」随机数的核心函数,参数含义如下:
| 参数名 | 默认值 | 作用说明 | 对应代码中的含义 |
|---|---|---|---|
loc |
0 | 正态分布的「均值(μ)」,决定分布的中心位置 | 噪声的平均值为 0(即噪声围绕真实值上下波动,不偏向正/负方向) |
scale |
1 | 正态分布的「标准差(σ)」,决定分布的离散程度 | 噪声的波动幅度为 1(标准差越大,噪声越分散;越小越集中) |
size |
None | 生成的随机数的「形状」(如1D数组、2D数组) | x.shape 表示:噪声数组的行数、列数和 x 完全一致(确保能和 y_true 逐元素相加) |
二、结合之前的代码场景理解
之前的代码中,这行是用来给「真实模型」添加噪声,模拟真实世界的数据(真实数据不会完美贴合理论模型,总会有测量误差、环境干扰等噪声):
y_true = 2 * x**2 + 3 * x + 1 # 理论上的真实模型(无噪声,完美曲线)
y = y_true + np.random.normal(0, 1, size=x.shape) # 加入噪声后的真实数据(散点)
具体效果:
y_true是纯理论值(比如100个x对应100个精准的y值,画出来是光滑的红色曲线);np.random.normal(0,1,size=x.shape)生成100个随机数(和x一样是 (100,1) 的2D数组),每个数都符合「均值0、标准差1」的标准正态分布;- 把这100个随机数(噪声)加到
y_true上,得到y(带噪声的真实数据)—— 这就是我们后续用来训练模型的「原始数据」(蓝色散点)。
三、关键细节:正态分布与噪声的合理性
-
为什么用正态分布?
真实世界中的噪声(如测量误差、环境干扰)大多遵循正态分布(中心极限定理):大部分噪声接近0(小误差),极少数噪声偏离0较远(大误差),这符合实际场景(比如用尺子测量长度,误差一般在±1mm内,很少出现±1cm的大误差)。 -
参数调整的影响(如果修改参数):
- 若把
loc=0改成loc=2:噪声均值为2,所有y值都会整体上移2(数据偏向正方向),但模型仍能通过拟合修正这个偏移; - 若把
scale=1改成scale=3:噪声标准差变大,数据点会更分散(离红色真实曲线更远),模型拟合难度增加(MSE会更高); - 若把
scale=0.1:噪声极小,数据点几乎贴合真实曲线,模型很容易拟合出完美结果。
- 若把
四、小例子:直观感受生成的随机数
运行以下代码,就能看到 np.random.normal(0,1,size=(5,1)) 生成的随机噪声是什么样的:
import numpy as np
np.random.seed(42) # 固定种子,让结果可复现# 生成5个符合标准正态分布的随机数(2D数组,和x的形状一致)
noise = np.random.normal(0, 1, size=(5, 1))
print("生成的噪声数据:")
print(noise)
输出(每次运行种子42时都相同):
生成的噪声数据:
[[ 0.49671415][-0.1382643 ][ 0.64768854][ 1.52302986][-0.23415337]]
可以看到:
- 数值围绕0波动(符合均值0);
- 大部分数值在±1.5之间(符合标准差1,正态分布中约95%的数据在±2σ内);
- 形状是 (5,1) 的2D数组(如果
x是 (100,1),这里就会生成100个值)。
五、和代码其他部分的关联
- 因为
size=x.shape,所以噪声数组和x、y_true的维度完全匹配(都是 (100,1)),才能用+号逐元素相加(广播机制); - 之前设置的
np.random.seed(42)会影响这里的噪声生成——固定种子后,每次运行生成的噪声都一样,确保后续的模型训练、数据划分结果可复现; - 噪声的存在是「多项式次数选择」的前提:如果没有噪声(
scale=0),高次多项式(如10次)也能完美拟合y_true,无法体现过拟合(训练集MSE极小但验证集MSE飙升)的现象。
总结
np.random.normal(0, 1, size=x.shape) 的核心作用是:
生成「标准正态分布」的随机噪声,形状与 x 一致,用于给理论模型 y_true 添加不确定性,模拟真实数据的特点——这是后续能区分「欠拟合、合适拟合、过拟合」的关键前提。