#导入相关包
import pandas as pd
import numpy as np
#定义梯度下降函数,并传入x,y,迭代次数n_iterations,惩罚度alpha和学习率learning_rate
def gd(x,y,n_iterations,alpha,learning_rate):
x = np.insert(x,0,1,axis=1) #在x中添加偏置项,并将其全部设为1
W = np.random.randn(x.shape[1]) #初始化权重项
#进行迭代
for i in range(n_iterations):
y_pred = np.dot(x,W)
error = y_pred-y
#定义损失函数并加入L2正则化惩罚
loss = np.mean(0.5*(error**2) + alpha * 0.5 * np.dot(W.T,W)
print("Iteration{0} | loss is {1}".format(i,loss))
#求解梯度
grad = np.dot(x.T,error) + alpha * W
#更新权重
W = W - learning_rate * grad
return W
以上就是线性回归梯度下降算法的python代码实现。
根据我们前面文章的推导过程,可能有一点容易迷惑,按照我们推导出损失函数的梯度为:
而在代码中,我们在计算梯度的时候却加上了一项:alpha*W,这是因为我们在损失函数中加入了L2正则化惩罚,在计算梯度时,也要对正则化惩罚项进行梯度求解,其实也就是岭回归。加入L1正则化惩罚就是lasso回归,同时加入L1和L2正则化惩罚项就是Elastic Net,正则化惩罚项的主要作用是为了避免数据过拟合,具体以后再说。