python一元线性回归算法_一元线性回归的算法思想

所谓的一元线性回归其实就是找到一条直线,使得该条直线可以以最小的误差(Loss)来逼近拟合训练数据

最小二乘法配合梯度下降算法,就是一个完整的线性回归过程本章知识点:

1. 最小二乘法表示

2. 梯度下降法原理

3. 复合函数求导过程

下面假设我们有N个二维训练数据点,我们的预测函数为h(x) = m * x + b

N个二维离散点

我们希望研究这群离散点的关系,我们不妨假设其关系是线性的,那么我们需要计算出一条直线L ,使得L距离每一个离散点都很近

最好的情况,我们希望所有的离散点都在L上,也就是满足L的方程,但是一条直线去拟合所有的点肯定是不现实的(不可能所有的点都满足线性关系)所以我们希望找到的L离所有的数据点尽可能的靠近,既找到每一个点(xi,yi)和L距离最小值 d = | yi - (m * xi + b)|,我们对N个d进行求和,由最小二乘法来表示误差函数为:

误差函数一

其中i表示第i个点,N表示样本总数,我们将Loss求和平均来作为最终的损失:

误差函数二

现在我们有了预测函数h(x)和损失函数Loss,那么我们怎么求出这条直线L来最好的拟合数据集呢?

其实也就是求L损失函数的最小化误差,这里一般有两个方法

1. 求函数极值

我们把Loss看成由m和b组合的二元函数,其中x,y,i,N均是已知的,那么求Loss最小值的问题就是求函数极值为题,利用基本的高数知识,我们需要求出每个变量的偏导数,并求解这组方程组:

偏导数求极值

涉及简单的复合函数求导和求和求导,非常基础的高数知识,我们只要用数学知识直接解出m和b,就可以得到L的方程

但是这不是一个最可靠的方法,因为计算机不适合直接求解数学方程的解,计算机是没有学过高等数学的,它只知道基本的加减乘除(本质上基于加法器实现),而计算机的计算能力非常出众,远远超过人类,我们应该从基本的数学定理的原理出发告诉计算机做某个基本的变化,让其迭代更新,用计算量换取结果,所以我们应该利用梯度下降法去逼近真实结果

2. 梯度下降法

这是一个非常神奇的算法,可以说没有它,就没有现在的深度学习,几乎所有的深度学习模型都会用到梯度下降算法,如最经典的反向传播算法,对所有参数使用梯度下降算法,使得神经网络模型的各个参数在训练数据上的损失函数尽可能小,也就是模型参数最合理,再一次的让神经网络发生了质变

其基本思想是:沿着损失(代价)函数梯度下降的方向搜索极小值(同理也可以沿着梯度上升的方向搜索极大值)

我们设x表示方程中的变量参数,J(x)表示在给定的参数取值下,训练数据集上损失函数的大小,那么整个优化的过程可以抽象为寻找一个适合的参数x,使得J(x)最小,而目前没有一个通用的方法可以对任意损失函数直接求解最佳的参数取值,而梯度下降算法会不断迭代更新参数x,即让参数x沿着总损失很小的方向去更新

梯度下降算法示意图

从上图中我们看到当x = 3.5时候,J(x)取得最小值,而最低点左侧的斜率是负值,另外一侧斜率是正值,这是再好不过的收敛条件,我们只要沿着梯度的方向一点一点的下滑,下滑的过程就是求导,下滑的次数,就是迭代,而每次需要下滑多长,需要通过步长来决定,所以我们还需要定义一个步长表示每次下滑的距离

一般来说,我们也将步长叫做学习率,而如何加速算法收敛速度和防止收敛过程中发生震荡,是一门值得研究的学问,有很多成熟的方法,如冲量策略,衰减因子策略等,这里不深入讲解

现在定义了学习率和迭代次数,我们就可以在迭代的过程中,一边求梯度,一边下滑更新参数了

很明显,我们需要在滑动中更新参数m和参数b

更新参数

因为梯度存在方向,所以我们使用加号并不会影响参数的更新

下面用python配合numpy模拟实现梯度下降算法过程

计算梯度,更新参数

迭代梯度下降算法

现在,我们利用梯度下降算法来优化Loss函数后,也得到了相应的m和b的值,那么也就找到了直线L = m*x + b,使得L以最小的误差去拟合训练数据

一元线性回拟合结果

代码和测试数据见:一元线性回归

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值