作者:田志晨
来源:小田学Python
最小二乘法
所谓的最小二乘法是一种数学优化技术,它通过最小化误差的平方和找到一组数据的最佳函数匹配。最小二乘法通常用于函数拟合以及求函数极值,很多其他的优化问题也可通过最小化能量或最大化熵用最小二乘形式表达。
例如已知坐标轴上有一些点,他们主要围绕着一条直线分布,显然并不都在线上,也就不能用一个一次线性表达式来表示,这就需要用到最小二乘法的思想,然后就用线性拟合来求,我们只要做到5个点到这条直线的距离的平方和最小即可。
一段小历史
十九世纪初,科学家勒让德发现了“最小二乘法”,但是并没有引起大家的注意。同时期意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星。经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置。随后他就求助全国的科学家来计算该行星的轨迹。这时候,就是年轻的高斯,利用最小二乘法计算出了轨迹,皮亚齐按照高斯计算的数据,果然找到了那颗行星。从此,最小二乘法名声大振。
认识最小二乘法
上面简单介绍了最小二乘法是怎么一回事,现在来学习一下最小二乘法到底是什么。
上面公式中,y 表示实际函数,yi 表示观测值,相减平方再求和即可以求出损失值,H越小,那么就代表各个点更接近拟合函数,拟合效果就越好。
例如使用一元线性拟合拟合:y=ax+b,将y带入公式,其中(xi,yi)是已有的观测值,那么现在 H 就是关于 a、b 的函数,接下来只需要求解器最小值即可。
最小二乘法求解
求解方法有两种,一种是代数方法,另一种是矩阵的方法。
代数方法就是利用高等数学中求偏导的知识,上述函数中包含两个参数,就分别对这两个参数求偏导,令偏导为零,可以得到两个方程,再联立求解。这个公式我就不在这里列举了,写出来更不容易理解,可以参考一下高等数学的课本。
接下来重点介绍下矩阵方法,因为本节内容是为后面介绍其他机器学习算法做准备的,而大部分算法中都是通过矩阵的概念来理解的。
上述是拟合函数的一般形式,其中第二行的 x = (x0,x1,x2...xn),w = (w0,w1...wn),上述是一组数据的表达式,例如有 m 个样本数据,那么 x 可以表示为 m*n 维矩阵,w 表示为 1*n 维矩阵。w 也就是 x 前的系数,取自weigh的首字母,有权重的含义。上述损失函数的公式可以写成如下形式。
然后进行对 w 求导计算,令导数为0,最终整理结果为(求导过程就不赘述了):
相对于代数计算,这样更方便,而且更利于计算机编程。以上说的是如果需要我们自己编程计算的情况下,实际上这些内容以及被各种库函数做过了,我们要做的只是调用而已。
最小二乘法评价
从上面最小二乘法的推理过程中可以看到,简洁高效,一步到位。但是也有很多缺点。首先,拟合函数需要是线性的,如果不是线性,那就还需要花时间去处理数据。再有就是其计算过程,想想当初学习线性代数时,求逆矩阵得多麻烦,计算机也是一样,矩阵维度较大时,耗时也成倍上升。当然,这些缺点也有其他方法来避免,那就是用梯度下降法,即便样本量很大,也可以快速迭代,得到局部最优解。
梯度下降法
梯度,简单来说就是最大方向导数,函数沿着该方向具有最大的变化率。下面举个例子说明一下梯度下降:
如果要找到该函数中的最低点,当然沿着梯度的方向,更容易找到最低点。具体怎么去找最低点,我们会选择一个步长,先随机找到一个位置,然后沿着梯度方向按照定义的步长向前走,这样就可以逐步的找到最低点。当然,还有可能这里面不止一个最小值,有好几个凹陷下去的地方,那么按照梯度下降的方法,可能仅仅找到的局部的最优解,这就需要后续对函数的一些处理或者对步长的处理。
整体上,就是逐步的找到导数趋近于0的位置。假设初始位置为x(t),步长为step,就拿上图中的函数来说,它是一个 y = x ** 2 的函数,那么梯度下降的迭代机理是什么样的呢?
注意 y' 是对函数求导了,一般情况下,样本是不和原函数完整吻合的,这里只是理解一下其原理。因此,在实际情况中,几乎不可能下降到一个导数为0的位置,所以给它设置一个精确条件,也就是下降的幅度在该条件之内,就认为它已经找到的局部最优解。
举个例子,仍然利用上述函数y=x**2,如果设置 step=0.5 ,x(t)=1,precision=0.1,则:
x(t+1) = x(t) - y'(x(t)) * step = 1 - 2*0.5 = 0
x(t+2) = x(t+1) - y'(x(t+1)) * step = 0 - 0*0.5 = 0
|x(t+2) - x(t+1)| = 0 < precision(这里由于是我们自定义的函数,计算出相差为0)
那上述的式子就可以看到求解出了函数的最小值,也就是 x=0 时,当然,上述的例子仅仅选用了一个简单的例子来展示一下梯度下降的过程。
(以上内容多偏理论,后续会有部分的应用展示)
梯度下降注意事项
1、步长问题,要根据实际数据选取适当的步长。若步长太大,可能会导致超出最优值,在附近一直跳,更严重者会导致梯度爆炸,数值异常大;若步长太小,又会导致迭代过慢,长时间不能找到最优解。
2、初始值问题,从不同的初始值出发,可能找到不同的局部最优解,其中若随时函数是凸函数的话,那必然仅有一个最优解,也就是全局最优解。对于局部最优解的问题,可以选取多个初值进行梯度下降,将找到的局部最优解再进行比较,寻找全局最优解
◆ ◆ ◆ ◆ ◆
长按二维码关注我们
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢
● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿婆主!
● 全球股市跳水大战,谁最坑爹!
● 上万条数据撕开微博热搜的真相!
● 你相信逛B站也能学编程吗