### 定义模型主体部分
### 包括线性回归公式、均方损失和参数偏导三部分
def linear_loss(X, y, w, b):
'''
输入:
X:输入变量矩阵
y:输出标签向量
w:变量参数权重矩阵
b:偏置
输出:
y_hat:线性模型预测值
loss:均方损失
dw:权重参数一阶偏导
db:偏差项一阶偏导
'''
# 训练样本数量
num_train = X.shape[0]
# 训练特征数量
num_feature = X.shape[1]
# 线性回归预测值
y_hat = np.dot(X, w) + b
# 计算预测输出与实际标签之间的均方损失
loss = np.sum((y_hat-y)**2)/num_train
# 基于均方损失对权重参数的一阶梯度
dw = np.dot(X.T, (y_hat-y)) /num_train
# 基于均方损失对偏差项的一阶梯度
db = np.sum((y_hat-y)) /num_train
return y_hat, loss, dw, db
在给定模型初始参数的情况下,线性回归模型根据训练数据和参数计算出当前均方损失和参数一阶梯度。
理解代码
dw = np.dot(X.T, (y_hat-y)) /num_train
通过一个简单的例子来说明:
- 矩阵 X:假设我们有3个样本,每个样本有2个特征,表示为一个 3x2 的矩阵。
- 向量 y_hat 和 y:分别为预测值和真实值,都是长度为3的一维向量。
具体示例:
- X = [[1, 2], [3, 4], [5, 6]]
- y_hat = [0.9, 0.8, 0.7]
- y = [1, 0, 0]
- num_train = 3
计算过程:
- (y_hat - y) = [-0.1, 0.8, 0.7]
- X.T = [[1, 3, 5], [2, 4, 6]]
- np.dot(X.T, (y_hat - y)) = [[5.8, 7.2]]
- dw = [[5.8, 7.2]] / 3 = [[1.9333, 2.4]]
结果 dw 是每个特征对应的梯度平均值。