在实现线性回归时,出现了一个问题:使用梯度下降,损失一次增加几个数量级。损失 - MSE,梯度下降 - 正常。我选择了加州住房数据集作为数据集。在写代码的时候,我依靠了文章。为了不和offset分开工作,我提前在特征矩阵的开头加了一列1。班级代码
class LinearRegression():
w = None
alpha = None
def __init__(self, lr, E=20):
self.lr = lr
self.w = np.zeros(X.shape[1] + 1)
self.E = E
def loss(self, X, y):
return np.sum((X @ self.w - y) ** 2) / X.shape[0]
def grad(self, X, y):
grad_basic = 2 * np.transpose(X) @ (X @ self.w - y) / X.shape[0]
assert grad_basic.shape == (X.shape[1],) , "Градиенты должны быть столбцом из k_features + 1 элементов"
return grad_basic
def sgd(self, X, y, E=20):
self.loss_arr = [self.loss(X, y)]
for _ in tqdm(range(E)):
if abs(self.loss_arr[-1]) < 0.1:
break
self.w -= self.lr * self.grad(X, y)
self.loss_arr.append(self.loss(X, y))
def fit(self, X, y):
self.sgd(X, y, self.E)
def get_params(self):
return self.w
def get_loss(self):
return self.loss_arr
def predict(self, X):
return X.dot(self.w)
这就是 loss 的行为方式:5.637, 288906709850, 3.250e+22...
同时,解析解被正确找到。它和完整的回归代码可以在notebook中找到。请告诉我哪里出错了
增加的误差可能表明梯度下降的方向是错误的——更具体地说,你正朝着误差增加的方向前进,而不是减少。检查代码中错误符号的位置。