第一阶段-第9天-NumPy多变量回归

第一阶段-第9天-NumPy多变量回归

今日目标

  1. 理解多变量回归与单变量的区别
  2. 用NumPy实现多变量线性回归
  3. 理解矩阵形式的梯度下降

学习内容

1. 多变量 vs 单变量

单变量:一个输入 → 一个输出

y = w * x + b

多变量:多个输入 → 一个输出

y = w1*x1 + w2*x2 + ... + wn*xn + b

2. 多变量房价预测

假设房价由三个因素决定:

  • 面积(平方米)
  • 楼层
  • 房龄(年)
importnumpyasnp# 训练数据:[面积, 楼层, 房龄] → 房价(万元)X=np.array([[100,5,10],# 100平米, 5楼, 10年房龄[120,8,5],# 120平米, 8楼, 5年房龄[80,3,15],# 80平米, 3楼, 15年房龄[150,10,2],# 150平米, 10楼, 2年房龄[90,6,8],# 90平米, 6楼, 8年房龄])y=np.array([200,280,150,350,180])print("输入矩阵形状:",X.shape)# (5, 3) — 5个样本, 3个特征print("输出向量:",y)

3. 矩阵形式

y = X @ w + b

其中:

  • X:输入矩阵 (n_samples, n_features)
  • w:权重向量 (n_features,)
  • b:偏置标量
  • @:矩阵乘法

4. 用NumPy实现多变量梯度下降

importnumpyasnp# 数据X=np.array([[100,5,10],[120,8,5],[80,3,15],[150,10,2],[90,6,8],])y=np.array([200,280,150,350,180])n_samples,n_features=X.shapeprint(f"样本数:{n_samples}, 特征数:{n_features}")# 初始化w=np.zeros(n_features)b=0.0learning_rate=0.00001# 多变量时需要更小的学习率epochs=1000print("\n开始训练...")forepochinrange(epochs):# 前向计算predictions=X @ w+b# 计算损失loss=np.mean((predictions-y)**2)# 计算梯度error=predictions-y gradient_w=(2/n_samples)*(X.T @ error)gradient_b=(2/n_samples)*np.sum(error)# 更新参数w=w-learning_rate*gradient_w b=b-learning_rate*gradient_bifepoch%200==0:print(f" 轮次{epoch:4d}: 损失={loss:.2f}")print(f"\n训练完成!")print(f"权重:{w}")print(f"偏置:{b:.2f}")# 预测test=np.array([[110,7,6]])# 新房子predicted=test @ w+bprint(f"\n预测: 110平米/7楼/6年房龄 → 房价{predicted[0]:.1f}万元")

5. 数据标准化

多变量时,不同特征的尺度差异很大(面积100 vs 楼层5),需要标准化:

# 计算均值和标准差X_mean=np.mean(X,axis=0)X_std=np.std(X,axis=0)print("均值:",X_mean)print("标准差:",X_std)# 标准化X_normalized=(X-X_mean)/X_stdprint("\n标准化后的数据:")print(X_normalized)# 现在所有特征的均值接近0,标准差接近1

今日练习

练习1:实现标准化并重新训练

importnumpyasnp X=np.array([[100,5,10],[120,8,5],[80,3,15],[150,10,2],[90,6,8],])y=np.array([200,280,150,350,180])# 标准化mean=np.mean(X,axis=0)std=np.std(X,axis=0)X_norm=(X-mean)/std# 训练w=np.zeros(X.shape[1])b=0.0lr=0.01forepochinrange(500):pred=X_norm @ w+b loss=np.mean((pred-y)**2)error=pred-y grad_w=(2/len(y))*(X_norm.T @ error)grad_b=(2/len(y))*np.sum(error)w-=lr*grad_w b-=lr*grad_bprint(f"w ={w}")print(f"b ={b:.2f}")print(f"最终损失 ={loss:.2f}")

练习2:理解矩阵乘法

importnumpyasnp# X是(3, 2),w是(2,),结果是(3,)X=np.array([[1,2],[3,4],[5,6]])w=np.array([10,20])result=X @ wprint("X @ w =",result)# 相当于:# [1*10 + 2*20, 3*10 + 4*20, 5*10 + 6*20]# = [50, 110, 170]

验收标准

  • 能解释多变量回归与单变量的区别
  • 能实现标准化的代码
  • 能运行多变量梯度下降
  • 能理解矩阵乘法的意义