第一阶段-第9天-NumPy多变量回归
今日目标
- 理解多变量回归与单变量的区别
- 用NumPy实现多变量线性回归
- 理解矩阵形式的梯度下降
学习内容
1. 多变量 vs 单变量
单变量:一个输入 → 一个输出
y = w * x + b多变量:多个输入 → 一个输出
y = w1*x1 + w2*x2 + ... + wn*xn + b2. 多变量房价预测
假设房价由三个因素决定:
- 面积(平方米)
- 楼层
- 房龄(年)
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]验收标准
- 能解释多变量回归与单变量的区别
- 能实现标准化的代码
- 能运行多变量梯度下降
- 能理解矩阵乘法的意义
