线性回归模型——梯度下降算法

引言

线性回归可能是我们接触最早的机器学习算法了,在高中数学的课本上,我们第一次正式认识这位朋友,通过最小二乘法来得到数据的线性回归方程,进而求得模型的参数。但其实,在初中时,我们就学过通过两个已知点坐标求解一次函数的技能,这也算是线性回归模型的一种特例吧。今天来给大家介绍另一种求解线性回归模型的方法——梯度下降法。

线性回归介绍

  • 线性回归定义

线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。

  • 举个例子

老黄勤勤恳恳打工数n年,终于攒下点儿小钱,想拿来买房~统计某楼盘数据如下:
在这里插入图片描述
把这些数据点绘制到坐标轴上,可以看出,房屋面积和房屋价格大致呈线性分布,即大致分布在一条直线上。如果能求出这条直线的方程,那么就能根据一个房屋的面积预测它的价格。
在这里插入图片描述
线性回归简化流程如下
在这里插入图片描述
其中,h(x)为:
在这里插入图片描述
目标:找到一条最好的拟合线,使得误差最小,也就是代价函数最小。代价函数(cost function)为:
在这里插入图片描述
代价函数与θ0,θ1的关系如图所示:
在这里插入图片描述

  • 梯度下降法介绍

梯度下降法就是可以使代价函数最小化的算法,即寻找合适的θ0、θ1使得代价函数J(θ0,θ1)最小,实现步骤为:
1.初始化θ0,θ1;
2.不停地改变θ0,θ1使得J(θ0,θ1)减小;
3.直到找到J(θ0,θ1)的最小值或局部最小值。
在这里插入图片描述
重复如下操作:
在这里插入图片描述
同时更新:
在这里插入图片描述
将h(x)代入式子得:
在这里插入图片描述
对θ0求偏导:
在这里插入图片描述
对θ1求偏导:
在这里插入图片描述
对于凸函数来说,梯度下降法一般能得到唯一最优解,对于非凸函数,可能会陷入局部最优解。
在这里插入图片描述
接下来就使用numpy手动实现梯度下降法线性回归,然后调用sklearn接口实现线性回归。

手动实现梯度下降法线性回归

1、导入可能需要用到的库,导入csv数据文件,定义x变量和y变量,绘图显示x,y数据分布情况。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

data = np.loadtxt('data.csv',delimiter=',')
x_data = data[:,0]
y_data = data[:,1
plt.scatter(x_data,y_data,marker='x',color='red')
plt.show()

输出结果如下,可以看出,x和y大致呈现线性分布。
在这里插入图片描述
2、定义学习率、初始截距和斜率、迭代次数,定义代价函数计算方法

learning_rate = 0.0001
b = 0
k = 0
n_iterables = 50

def compute_mse(x_data,y_data,k,b):
    mse = np.sum((y_data-(k*x_data+b))**2)/len(x_data)/2
    return mse

3、定义梯度下降函数,需要将x、y、初始截距、初始斜率、学习率、迭代次数作为参数传入,最终输出结果为目标截距、目标斜率,代价函数值列表。

def gradient_descent(x_data,y_data,k,b,learning_rate,n_iterables):
    m = len(x_data)
    start_loss = compute_mse(x_data,y_data,k,b)
    loss_value = [start_loss]
    for i in range(n_iterables):
        b_grad = np.sum((k*x_data+b)-y_data)/m
        k_grad = np.sum(((k*x_data+b)-y_data)*x_data)/m
        b = b - (learning_rate*b_grad)
        k = k - (learning_rate*k_grad)
        loss_value.append(compute_mse(x_data,y_data,k,b))
        print(b,k)
    return b,k,np.array(loss_value)

4、调用函数,得到结果,绘图。

b1,k1,loss_list = gradient_descent(x_data,y_data,k,b,learning_rate,n_iterables)
y_predict = k1*x_data+b1
print(b1,k1)

plt.scatter(x_data,y_data,marker='x',color='red')
plt.plot(x_data,y_predict)
plt.show()

输出结果b1=0.03056,k1=1.47889
如图,看着感觉还可以。
在这里插入图片描述
5、画出代价函数随迭代次数变化的曲线,如图所示,可以看出,经过10次迭代后,代价函数的变化就比较小了。

plt.plot(range(n_iterables+1),loss_list)
plt.xlabel('迭代次数')
plt.ylabel('损失值')
plt.show()

在这里插入图片描述

调用API接口实现线性回归

1、同样导入可能需要用到的库,导入csv数据文件,定义x变量和y变量,绘图显示x,y数据分布情况。

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

data = np.loadtxt('data.csv',delimiter=',')
x_data = data[:,0,np.newaxis]
y_data = data[:,1]
plt.scatter(x_data,y_data,marker='x',color='red')
plt.show()

图片
2、定义模型,进行拟合,然后预测,得到结果,进行绘图,可以看到,调用API接口步骤非常简单。

model = LinearRegression()
model.fit(x_data,y_data)
y_predict = model.predict(x_data)
plt.scatter(x_data,y_data,marker='x',color='red')
plt.plot(x_data,model.predict(x_data),'b')
plt.show()

在这里插入图片描述
3、打印输出截距和斜率

b = model.intercept_
k = model.coef_[0]
print(b,k)

输出:b=7.99102,k=1.322431,与上面得到的结果还是有一些差异的,因为上面只迭代了50次,而调用接口得到的是精确解。

小伙伴,你学会了吗?扫描下方二维码关注公众号,在后台回复“线性回归1”即可获取数据和源代码。
在这里插入图片描述

  • 16
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在提到梯度下降算法的矩阵转化时,引用内容没有提及相关信息。梯度下降算法的矩阵转化通常指的是将梯度下降算法应用于矩阵计算中的线性回归问题。在矩阵转化中,我们可以将样本特征和目标变量组成矩阵,使用矩阵运算来进行梯度下降,从而有效地处理多变量的线性回归问题。 具体来说,在矩阵转化中,我们可以定义一个参数矩阵来表示线性回归模型的权重,通过最小化损失函数来更新参数矩阵。损失函数的梯度可以通过矩阵的转置和矩阵乘法来计算,从而实现对参数矩阵的更新。通过不断迭代更新参数,梯度下降算法可以找到使损失函数最小化的最优参数矩阵。 在使用梯度下降算法进行矩阵转化时,需要注意选择合适的学习率来控制参数的更新步长,并进行适当的数据预处理以避免特征之间的差异过大对结果的影响。此外,还可以使用正则化方法来解决过拟合问题。 总结起来,梯度下降算法的矩阵转化是将梯度下降算法应用于矩阵计算中的线性回归问题,通过更新参数矩阵来最小化损失函数,从而找到最优解。通过选择合适的学习率和进行数据预处理,可以提高算法的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [梯度下降算法](https://blog.csdn.net/sztsz/article/details/130348859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [梯度下降算法原理讲解——机器学习](https://blog.csdn.net/qq_41800366/article/details/86583789)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值