zoukankan      html  css  js  c++  java
  • 机器学习小白笔记系列——线性回归

    本系列是针对于DataWhale学习小组的笔记,从一个对统计学和机器学习理论基础薄弱的初学者角度出发,在小组学习资料的基础上,由浅入深地对知识进行总结和整理,今后有了新的理解可能还会不断完善。由于水平实在有限,不免产生谬误,欢迎读者多多批评指正。如需要转载请与博主联系,谢谢

    线性回归算法核心概念


    线性回归是什么?

    回归模型是用来表示输入变量(自变量)到输出变量(因变量)之间映射关系的函数。当该函数属于线性函数时被称为线性回归模型,可以将其看作是由一个或多个被称为回归系数的模型参数的线性组合。
    通俗地说就是用来定量表示多个指标(比如房间数量、房间面积与总房价)之间存在的数量关系的线性方程。

    线性回归一般实现形式

    假设(x_{1})(x_{2})……(x_{d})为待研究对象的自变量(如房间数量、房间面积等),(y)为与自变量有关的因变量(总房价),若用线性函数表示,则二者的关系可以写作:

    [egin{align*} f(x) &= heta_0 + heta_1x_1 + heta_2x_2 + ... + heta_dx_d \ &= sum_{i=0}^{d} heta_ix_i \ end{align*}]

    其中(θ_{i})是模型的参数,负责调整每个自变量对因变量影响的权重。线性回归模型拟合的过程就可以看做是利用我们已获得的数据集(采样得到,其中每一组数据都包含该样本各个自变量的值(x_{i})及其对应的因变量的值(y_{i}))来寻找最合适的参数(θ_{i}),从而使模型的预测值(f(x))尽可能接近真实值(y)的过程。

    而想要找到最合适的参数,就要有一个评价模型效果的标准,还要有一个调整参数的策略。
    均方误差作为预测值与真实值之差的平方和,是线性回归模型中最常用的评价指标之一,即:

    [J( heta)=frac{1}{2}sum_{j=1}^{n}(f_{ heta}(x^{(i)})-y^{(i)})^2 ]

    我们的任务就是通过令均方误差取最小值来寻找最优的模型参数,此处的均方误差也被称为代价函数(Cost Function),即用来度量全部样本集的平均偏离程度的函数。

    线性回归模型的优化方法

    由上述讨论可知,我们需要一个参数调整策略来实现代价函数的最小化,这里常用的方法有最小二乘法、梯度下降法、牛顿法及拟牛顿法等:

    最小二乘法(Least squares):
    假设针对某一问题的数据集中共有n个样本(观测值),每个样本含有m个特征(自变量),其可由矩阵表示为:

    [ X = left[ egin{array} {cccc} (x^{(1)})^T\ (x^{(2)})^T\ ldots \ (x^{(n)})^T end{array} ight] = egin{bmatrix} x_{11} & x_{12} & x_{13} & ldots & x_{1m}\ x_{21} & x_{22} & x_{23} & ldots & x_{2m}\ &&ldots \ x_{n1} & x_{n2} & x_{n3} & ldots & x_{nm} end{bmatrix} ]

    其输出(因变量)可表示为:

    [Y = left[ egin{array} {cccc} y^{(1)}\ y^{(2)}\ ldots \ y^{(n)} end{array} ight]]

    此时线性方程可写作:

    [f_ heta(x)=X heta ]

    通过推导,最优参数θ可由下式得出:

    [ heta = (X^TX)^{(-1)}X^TY ]

    上述方法为最小二乘法的矩阵解法,该解法相比与其他解法更加简洁,也便于计算机操作,是实现最小二乘法的最常用方法之一。

    梯度下降法(Gradient descent):
    梯度下降的核心思路就是利用迭代不断更新参数,使得目标函数收敛到最小值,其具体实现方法是在可微函数(目标函数)的当前位置寻找令函数值下降最快的方向(即梯度的反方向,梯度可看做是由函数对每个自变量分别求导构成的向量),然后沿该方向以一定速度对自变量(即参数θ)进行更新,如下式所示:

    [ heta_j:= heta_j-alphafrac{partial{J( heta)}}{partial heta} ]

    α为学习速率,决定了执行每一步梯度下降的步幅,速率越大,函数值下降越快,但过大的学习速率可能带来不收敛的问题。式中对J(θ)的求导:

    [egin{align*} frac{partial{J( heta)}}{partial heta} &= frac{partial}{partial heta_j}frac{1}{2}sum_{i=1}^{n}(f_ heta(x)^{(i)}-y^{(i)})^2 \ &= 2*frac{1}{2}sum_{i=1}^{n}(f_ heta(x)^{(i)}-y^{(i)})*frac{partial}{partial heta_j}(f_ heta(x)^{(i)}-y^{(i)}) \ &= sum_{i=1}^{n}(f_ heta(x)^{(i)}-y^{(i)})*frac{partial}{partial heta_j}(sum_{j=0}^{d} heta_jx_j^{(i)}-y^{(i)}))\ &= sum_{i=1}^{n}(f_ heta(x)^{(i)}-y^{(i)})x_j^{(i)} \ end{align*}]

    此处下标j表示第j个参数,上标i表示第i个数据点。将$$frac{partial{J( heta)}}{partial heta}$$代入后写成向量表示的参数更新式:

    [ heta = heta + alphasum_{i=1}^{n}(y^{(i)}-f_ heta(x)^{(i)})x^{(i)} ]

    此方法成为批梯度下降,即一次迭代同时对所有样本进行计算,在目标函数为凸函数时,可保证到达最小值,但当样本量大时会带来很大的计算量。为了解决这一问题,人们又提出了随机梯度下降方法:

    [ heta = heta + alpha(y^{(i)}-f_ heta(x)^{(i)})x^{(i)} ]

    随机梯度下降方法计算量小,程序运行速度快,但存在精度下降,可能收敛至局部最优等缺点。因此后来又提出了小批量梯度下降法,即每次计算固定数目的样本来对参数进行更新,在此不再赘述。

    牛顿法(Newton's method)和拟牛顿法(Quasi-Newton methods):
    牛顿法和拟牛顿法也是处理无约束最优化问题的常用方法,其突出特点为收敛速度快。牛顿法的基本思路是利用泰勒展开对较为复杂的函数在当前位点做线性函数近似,然后通过求该函数在区域内的极小值来逼近原函数的最小值,并通过反复迭代来完成对最小值的搜寻。对函数f(x)作泰勒展开并忽略二次以上高阶项得:

    [f(x) = f(x_0) + f'(x_0)(x - x_0)+frac{1}{2}f''(x_0)(x - x_0)^2 ]

    以向量形式表示为:

    [f(x) = f(x_0) + igtriangledown f(x_0)^{T}(x - x_0)+frac{1}{2}(x - x_0)^{T}igtriangledown ^{2}f(x_0)(x - x_0) ]

    两边同时求梯度并令梯度等于0可得:

    [x = x_0 - left ( igtriangledown ^{2}f(x_0) ight )^{-1}igtriangledown f(x_0) ]

    其中(igtriangledown ^{2}f(x_0))我们称为Hessian矩阵,用H表示。
    回到我们参数优化的问题,设(l( heta))为损失函数,我们更新的策略是:

    [ heta := heta-frac{l'( heta)}{l''( heta)}= heta - H^{-1}Delta_{ heta}l( heta) ]

    其中,(Delta_{ heta}l( heta))(l( heta))( heta_i)的偏导数,也就是求梯度。(H)(J( heta))的海森矩阵,

    [H_{ij} = frac{partial ^2l( heta)}{partial heta_ipartial heta_j} ]

    总结下牛顿法的完整步骤为:

    1. 设定初始值(x_0)及精度要求ε。
    2. 计算当前近似函数的梯度(Delta_{ heta}l( heta))和Hessian矩阵。
    3. 判断,如果梯度的模小于精度要求ε,则模型收敛,停止迭代,否则继续下一步。
    4. 根据参数更新公式进行迭代,获得下一个点位置(x_1),然后返回到第二步。

    海森矩阵的计算较为复杂,当参数的维度很多时影响更大。因此人们提出拟牛顿法,及不用二阶偏导数而构造出可以近似海塞矩阵(或海塞矩阵的逆)的正定对称阵B来完成计算。设(x_k)是第k个迭代值,则对该新构造矩阵的要求如下(忽略证明...):

    [f'(x_{k+1}) - f'(x_k) = f''(x_k)(x_{k+1}- x_k)= H(x_{k+1}- x_k) ]

    从网络上看到的常用的拟牛顿法迭代公式总结表:

    今后有时间再对拟牛顿法做一些深入探讨。

    参考资料:

    1. https://github.com/datawhalechina/team-learning/tree/master/机器学习算法基础 DataWhale小组学习资料
    2. https://baike.baidu.com/item/线性回归/8190345?fr=aladdin 百度百科——线性回归
    3. https://blog.csdn.net/qq_41800366/article/details/86583789 梯度下降法原理讲解
    4. https://blog.csdn.net/sigai_csdn/article/details/80678812 理解牛顿法
    5. https://zhuanlan.zhihu.com/p/46536960 牛顿法和拟牛顿法
  • 相关阅读:
    Selenium 2自动化测试实战
    Python学习笔记整理(python 3)
    Python编程中出现ImportError: bad magic number in 'numpy': b'x03xf3 '
    收集的一些表单常用的正则表达式。
    转载的一篇博客,感觉不错,自我感觉很到位,来自 http://www.cnblogs.com/laizhihui/p/5810965.html
    闲来无写的,就是中间有一条小细线,求大神指点。
    自己总结的有关PHP一些基本知识和一些常见的js问题
    不经意间看到的东西,感觉不错(转载)。
    无束缚版贪吃蛇(就问你爽不爽)
    小图局部放大效果(图片的话就自己找一个吧,记得是一张图片用两次,不是两张图片,而且你的图片不一定与我一样,需改一下放大的尺寸)
  • 原文地址:https://www.cnblogs.com/liugd-2020/p/12736960.html
Copyright © 2011-2022 走看看