学习笔记 | 线性回归模型代码
代码
#线性回归模型 损失函数使用均方计算 优化算法采用梯度下降
import numpy as np
m,n=100,3
X=np.random.rand(m,n)
w0=np.array([[3.1415926],[3.1415927],[3.1415928]])
noise=0.05*np.random.rand(m,1)
y=X@w0+1.142857+noise
#设置线性参数 w,b
w=np.zeros((n,1))
b=0.0
#设置学习率、循环次数
lr=0.01
epochs=5000
#计算误差
for i in range(epochs):
y_pred=X@w+b
loss=np.mean((y_pred-y)**2)
#计算梯度
w_grad=1/m*X.T@(y_pred-y)
b_grad=1/m*np.sum(y_pred-y)
#更新
w=w-lr*w_grad
b=b-lr*b_grad
if i % 50 == 0:
print(f"Epoch {i}, Loss: {loss:.4f}")
print(f"Final w: {w.ravel()}, b: {b}") # .ravel() 展平打印
一些疑惑
1.维度问题(特别是矩阵微积分的维度问题、前后问题)
· 为什么是y_pred=Xw+b而不是反过来:
——X为mxn矩阵,w作为权重是mx1向量(机器学习列向量信仰!!!),所以为了权重匹配写作Xw
· 为什么梯度计算过程中矩阵求导的时候是w_grad=1/mX.T@(y_pred-y)而不是w_grad=1/m(y_pred-y)@X.T:
——以维度适配角度,w的梯度必须与w自身保持一致,并且y_pred-y与y一致为mx1,且不能转置,而X.T是nxm,所以要在前
以 矩阵微积分角度看,当对向量求导时,雅可比矩阵(Jacobian)的转置会自然出现在链式法则中,这就导致了X.T的出现。

浙公网安备 33010602011771号