用于岭回归的梯度下降法

我正在尝试编写一个使用梯度下降法返回岭回归参数的代码。岭回归定义如下:

enter image description here

其中,L 是损失(或成本)函数。w 是损失函数的参数(包含 b)。x 是数据点。y 是每个向量 x 的标签。lambda 是正则化常数。b 是截距参数(被纳入 w 中)。所以,L(w,b) = 数值

我应该实现的梯度下降算法如下所示:

enter image description here

其中 ∇ 是 L 关于 w 的梯度。η 是步长。t 是时间或迭代计数器。

enter image description here

我的代码:

def ridge_regression_GD(x,y,C):    x=np.insert(x,0,1,axis=1) # adding a feature 1 to x at beggining nxd+1    w=np.zeros(len(x[0,:])) # d+1    t=0    eta=1    summ = np.zeros(1)    grad = np.zeros(1)    losses = np.array([0])    loss_stry = 0    while eta > 2**-30:        for i in range(0,len(y)): # here we calculate the summation for all rows for loss and gradient            summ=summ+((y[i,]-np.dot(w,x[i,]))*x[i,])            loss_stry=loss_stry+((y[i,]-np.dot(w,x[i,]))**2)        losses=np.insert(losses,len(losses),loss_stry+(C*np.dot(w,w)))        grad=((-2)*summ)+(np.dot((2*C),w))        eta=eta/2        w=w-(eta*grad)        t+=1        summ = np.zeros(1)        loss_stry = 0    b=w[0]    w=w[1:]    return w,b,losses

输出应为截距参数 b、向量 w 和每次迭代的损失值 losses。

我的问题是,当我运行代码时,w 的值和 losses 的值都在增加,达到 10^13 的数量级。

如果您能帮助我解决这个问题,我将不胜感激。如果您需要更多信息或澄清,请随时提出要求。

注意:此帖子已从 Cross Validated 论坛删除。如果有更适合发布的论坛,请告诉我。


回答:

在检查了您的代码后,发现您的岭回归实现是正确的,导致 w 值增加从而导致损失增加的问题是由于参数的更新值极端且不稳定(即 abs(eta*grad) 太大),所以我调整了学习率和权重衰减率到适当范围,并改变了您衰减学习率的方式,然后一切都按预期工作:

import numpy as npsample_num = 100x_dim = 10x = np.random.rand(sample_num, x_dim)w_tar = np.random.rand(x_dim)b_tar = np.random.rand(1)[0]y = np.matmul(x, np.transpose([w_tar])) + b_tarC = 1e-6def ridge_regression_GD(x,y,C):    x = np.insert(x,0,1,axis=1) # adding a feature 1 to x at beggining nxd+1    x_len = len(x[0,:])    w = np.zeros(x_len) # d+1    t = 0    eta = 3e-3    summ = np.zeros(x_len)    grad = np.zeros(x_len)    losses = np.array([0])    loss_stry = 0    for i in range(50):        for i in range(len(y)): # here we calculate the summation for all rows for loss and gradient            summ = summ + (y[i,] - np.dot(w, x[i,])) * x[i,]            loss_stry += (y[i,] - np.dot(w, x[i,]))**2                    losses = np.insert(losses, len(losses), loss_stry + C * np.dot(w, w))        grad = -2 * summ + np.dot(2 * C,w)        w -= eta * grad        eta *= 0.9        t += 1        summ = np.zeros(1)        loss_stry = 0    return w[1:], w[0], lossesw, b, losses = ridge_regression_GD(x, y, C)print("losses: ", losses)print("b: ", b)print("b_tar: ", b_tar)print("w: ", w)print("w_tar", w_tar)x_pre = np.random.rand(3, x_dim)y_tar = np.matmul(x_pre, np.transpose([w_tar])) + b_tary_pre = np.matmul(x_pre, np.transpose([w])) + bprint("y_pre: ", y_pre)print("y_tar: ", y_tar)

输出结果:

losses: [   0 1888 2450 2098 1128  354   59    5    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1]b:  1.170527138363387b_tar:  0.894306608050021w:  [0.7625987  0.6027163  0.58350218 0.49854847 0.52451963 0.59963663 0.65156702 0.61188389 0.74257133 0.67164963]w_tar [0.82757802 0.76593551 0.74074476 0.37049698 0.40177269 0.60734677 0.72304859 0.65733725 0.91989305 0.79020028]y_pre:  [[3.44989377] [4.77838804] [3.53541958]]y_tar:  [[3.32865041] [4.74528037] [3.42093559]]

从输出中的损失变化可以看出,学习率 eta = 3e-3 仍然有点大,所以在最初的几次训练回合中损失会上升,但当学习率衰减到适当值时,损失开始下降。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注