机器学习算法篇--回归--最小二乘法(Ordinary Least Square)

定义:

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

准备工作:

在理解最小二乘法之前,需要提前了解三个数学知识(假设数学已经还给生物老师的情况下)

  1. 三项式平方展开:(x+y+z)^2 可以看作是((x+y)+z)^2 就是把三项式转化为二项式

  2. 一次函数:在某一个变化过程中,设有两个变量x和y,如果可以写成y=kx+b(k为一次项系数≠0,k≠0,b为常数,),那么我们就说y是x的一次函数,是一条直线,其中x是自变量,y是因变量 (又称函数)。

  3. 一元二次函数取最小值:y = ax^2 + bx + c 开口向上的情况下,要取最小值,就是取在对称轴处,x= - (b/2a)

推导过程:

假设我们有一组数据 [ [x1,y1] , [x2,y2] , [x3,y3]......[xn,yn] ] ,其中 x 代表程序员的数学能力,y 代表程序员的薪资

把这些点都放在坐标系中,并画出一条趋势线,如下图所示:

机器学习算法篇--回归--最小二乘法(Ordinary Least Square)

最能代表这组数据的趋势的直线是:使得这些数据点与直线的距离的平方和最小的那样一条直线,从整体上看这些点和直线的距离最近。

注意:这些点可能是正相关性,但是并不代表因果关系,说人话就是 “ 随着程序员的数学能力增长,薪资水平也在增长,是成正相关性的,但是并不是因为数学能力增长导致薪资增长,薪资增长可能有其他原因,比如沟通能力强,管理能力提高等等 ”

这条直线可以用 y=k*x+b 一次函数表示,数据集中的任意一点,可以用 (xn,yn)表示,对应直线上任意一点 (xm, ym),可以用 (xn,k*xn + b)表示。备注:直线上的点x坐标和对应的数据集上的点是一样的都是xn即xm=xn,y坐标则是利用一次函数带入表示的 ym = k*xm+b 所以 (xm,ym) 等价于 (xn,k*xn + b)

直线到数据点的距离的平和等于:(相应的两个点的y坐标相减)

m

S =∑ (k*xn + b - yn)^2

n=1

我们目的是要找到平方和最小的那条直线,所以就转化为求上面公式的最小值的问题,我们先把公式展开来:(下面求和公式就用∑来表示了,m 和 n=1就省略了,大家要明白是求从 1到m的和)

S = ( ∑xn^2) * k^2 + 2 * ( ∑ ( xn * ( b-yn ) ) )*k + ∑ ( b-yn )^2

上面展开就是根据开篇提到的第一个准备知识点,三项式转二项式来展开的。关于k展开的如上面所示,关于b展开的如下面所示,为什么要展开两种形式呢?别着急,老铁,继续往下看

S = n*b^2 + 2 * (∑ ( k*xn-yn ))*b + ∑ ( k*xn-yn )^2

这两个可以看作是一个一元二次函数 类似 y = ax^2 + bx + c ,而根据开篇的第三个知识点求一元二次函数的最小值x= - (b/2a),恰恰就是求平方和的最小值要用到的。带入方程可得:

c = - ( 2 * (∑ ( k*xn-yn ))/2n )

= ( 1/n ) ( ∑yn - k∑*xn )

k = - ( 2 * ( ∑ ( xn * ( b-yn ) ) ) / 2∑xn^2)

= ( ∑xnyn - b ∑xn) / ∑xn^2

这里就是上面为什么要做关于k和c展开式的原因了,是要构造一个二元一次方程组,接下来就是求这个二元一次方程组,然后带入到原来的求和公式中去。

看起来很复杂,其实就是解方程,一步一步来,带入参数即可,此处忽略。

下面用python的代码来表示一下,是一个寻找计算彗星轨迹的方法的demo:

# y = mx + b

# m is 斜率, b is y-截距

def compute_error_for_line_given_points(b, m, coordinates):

totalError = 0

for i in range(0, len(coordinates)):

x = coordinates[i][0]

y = coordinates[i][1]

totalError += (y - (m * x + b)) ** 2

return totalError / float(len(coordinates))

# example

compute_error_for_line_given_points(1, 2, [[3,6],[6,9],[12,18]])

首先猜测彗星未来的位置,然后平方误差,最后重新猜测以减少平方误差的总和。这就是线性回归损失函数的基础。

在 Jupyter notebook 上运行上述代码,并逐渐熟悉它。m 代表系数(coefficient),b 代表预测中的常量,coordinates 代表彗星的位置。目的就是找到 m 和 b 的一种组合,使误差最小化。

机器学习算法篇--回归--最小二乘法(Ordinary Least Square)

总结:

最小二乘法是非常重要的一个算法,后面学习到的深度学习,神经网络,决策树等等,都是基于它的,花时间搞清楚它的原理很有必要。


分享到:


相關文章: