1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 梯度下降法求解线性回归

梯度下降法求解线性回归

时间:2020-06-19 23:10:52

相关推荐

梯度下降法求解线性回归

梯度下降法求解线性回归

通过梯度下降法求解简单的一元线性回归

分别通过梯度下降算法和sklearn的线性回归模型(即基于最小二乘法)解决简单的一元线性回归实际案例,通过结果对比两个算法的优缺。

通过最小二乘法解决一元线性回归可以参考下面文章

/coffeetogether/article/details/118114217

数据源:

链接: /s/1KVw_9O5o9vqQnpgRNfLGVQ

提取码:8u8e

一、梯度下降算法介绍

二、梯度下降法求解线性回归

三、梯度下降法求解一元线性回归案例

1.导入数据

# 导入必要库import numpy as npimport matplotlib.pyplot as plt

points = np.genfromtxt('E:/PythonData/machine_learning/data.csv',delimiter=',')# 查看前5行数据points[:5]

2.绘制散点图

# 分别提取points中的x和y数据x = points[:,0]y = points[:,1]# 绘制散点图plt.scatter(x,y)plt.show()

3.定义损失函数

# 损失函数是系数w,b的函数,另外还要传入数据x,ydef computer_cost(w,b,points):total_cost = 0M = len(points)# 逐点计算平方损失误差,然后求平均数for i in range(M):x = points[i,0]y = points[i,1]total_cost +=(y - w *x - b)**2# 取平均return total_cost/M

4.定义模型的超参数

# 步长alpha = 0.0001# 初始winitial_w = 0# 初始binitial_b = 0# 迭代次数num_iter = 10

5.定义核心函数

def grad_desc(points,initial_w,initial_b,alpha,num_iter):w = initial_wb = initial_b# 定义一个list保存所有的损失函数值,用来显示下降的过程cost_list = []for i in range(num_iter):cost_list.append(computer_cost(w,b,points))w,b = step_grad_desc(w,b,alpha,points)return [w,b,cost_list]def step_grad_desc(current_w,current_b,alpha,points):sum_grad_w = 0sum_grad_b = 0M = len(points)# 对每个点,代入公式求和for i in range(M):x = points[i,0]y = points[i,1]sum_grad_w += (current_w*x+current_b - y)*xsum_grad_b += current_w*x+ current_b - y# 用公式求当前的梯度grad_w = 2/M*sum_grad_wgrad_b = 2/M*sum_grad_b# 梯度下降,更新当前的w和bupdated_w = current_w - alpha*grad_wupdated_b = current_b - alpha*grad_breturn updated_w,updated_b

6.测试:运行梯度下降算法计算最优的w和b

w,b,cost_list = grad_desc(points,initial_w,initial_b,alpha,num_iter)cost = computer_cost(w,b,points)print('w is :',w)print('b is :',b)print('cost is :',cost)plt.plot(cost_list)plt.show()

7.绘制拟合曲线

plt.scatter(x,y)# 针对每一个x ,计算出预测的y值pred_y = w*x+bplt.plot(x,pred_y,c='r')plt.show()

8.预测得分

pred_y1 = w*80+bprint(pred_y1)

四、通过sklearn库中的LinearRegression模型求解一元线性回归

1.导入数据

# 导入必要库import numpy as npimport matplotlib.pyplot as plt

points = np.genfromtxt('E:/PythonData/machine_learning/data.csv',delimiter=',')# 查看前5行数据points[:5]

2.绘制散点图

# 分别提取points中的x和y数据x = points[:,0]y = points[:,1]# 绘制散点图plt.scatter(x,y)plt.show()

# 损失函数是系数w,b的函数,另外还要传入数据x,ydef computer_cost(w,b,points):total_cost = 0M = len(points)# 逐点计算平方损失误差,然后求平均数for i in range(M):x = points[i,0]y = points[i,1]total_cost +=(y - w *x - b)**2# 取平均return total_cost/M

3.通过sklearn库,求解线性回归

# 导入库from sklearn.linear_model import LinearRegression

4.创建线性回归模型

# 创建线性回归模型lr = LinearRegression()

# 传入数据,进行拟合# 将数据x和y都转换成二维数据x_new = x.reshape(-1,1)y_new = y.reshape(-1,1)lr.fit(x_new,y_new)# 查看拟合结果# 得到w参数(斜率)w = lr.coef_[0,0]# 得到参数b(截距)b = lr.intercept_[0]print('w is :',w)print('b is :',b)# 得出损失值cost = computer_cost(w,b,points)print('cost is :',cost)

5.绘制拟合曲线

plt.scatter(x,y)# 针对每一个x,给出预测的y值pred_y = w*x + bplt.plot(x,pred_y,c='r')plt.show()

6.预测得分

# 给出x值,预测得分yx1 = 80pred_y1 = w*x1+bpred_y1

总结:sklearn中的LinearRegression模型的底层原理是通过最小二乘法实现的,因此对比两种方法:

通过两个方法得出的cost分别约为112,110。结果可知:在解决一元线性回归问题上,最小二乘法的效果会更佳。

由上图对比可知,最小二乘法直接通过求导找到损失函数的全局最小值,而梯度下降则是通过不断地迭代无限接近最小值。因此,在精度上最小二乘法略高于梯度下降法。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。