一元线性回归入门——自己写简单的回归算法
1 什么是线性回归?
早在初中我们就学习过一次函数 ,它的一般形式我们应该还记得吧,就像是这样 y=kx+b y = k x + b 。这个一次函数实际上,就是一元一次函数。那时候学到的求解这个函数解析式的方法就是待定系数法 ,来确定其中k和b的值。而线性回归这个词在统计学习中,同样是确定一个一次函数解析式中的位置参数,在图像上来看就相当于,你想找一条直线,让他们尽量穿过已知(一般都是大量的)的数据点,或者让他们到直线距离之和最短。但是这里用的不是待定系数法,下面介绍原因。
现实世界中的数据总是存在各种误差,比如测量工具的误差,人度数的误差等等。而且数据的产生也大部分是一个随机的过程。所以如果现实世界中存在某些线性关系,那么这个关系也一定是近似的。所以其一次函数其实是这样的:
y=kx+b+e
y
=
k
x
+
b
+
e
其中
e
e
是数据偏离线性的误差,这个误差是服从正态分布的。什么!你还不知道什么是正态分布?那请先学习下相关知识。就是因为这个的存在,所以对于每一组数据
(x,y)
(
x
,
y
)
,他们的误差都是不同的,所以在前面那个式子中,我们不能使用待定系数法求得尽量精确的解。所以就需要一个更高端的做法。
先不考虑怎么做的话,我们既然知道有这个误差存在了,那么我们就应该让这个误差尽量减小,数据已经是确定好了的,我们只能在计算方法上做文章。这里移项可以得到误差的方程:
|e|=|y−kx−b|
|
e
|
=
|
y
−
k
x
−
b
|
所以现在我们就应该想方法,利用已知的
(x,y)
(
x
,
y
)
来找的合适的
k,b
k
,
b
使
|e|
|
e
|
的和对于所有的已知点最小,这就是线性回归的思路。下面介绍具体方法。
2 线性回归的方法
为了求解出最小的
∑i=1n|ei|
∑
i
=
1
n
|
e
i
|
,我们可以其实可以利用平方消去其中的绝对值符号,得到了我们的要求的式子:
为了取到最小的 S,我们可以对上式分别对k和b求偏导,并令它们为0,以求的S的极值。
根据这个式子,可以知道偏导数的图像(如左图)和原函数随k或者b变化的图像(类似于右图)
所以可以说,当这两个偏导数都取到0的时候,就是误差 ∑e2 ∑ e 2 取到 最小值的时候。现在将k和b提取出来
好的,到这里其实已经可以通过上面的步骤来编写我们的程序算法了。
3 算法实现(Python)
按照上面的套路,可以写出如下代码,数据是瞎编的。
#根据y=2*x+b随意写几个数
X=[1,2,3,4,5,6,7]
Y=[3.09,5.06,7.03,9.12,10.96,12.91,15.01]
Xsum=0.0
X2sum=0.0
Ysum=0.0
XY=0.0
n=len(X)
for i in range(n):
Xsum+=X[i]
Ysum+=Y[i]
XY+=X[i]*Y[i]
X2sum+=X[i]**2
k=(Xsum*Ysum/n-XY)/(Xsum**2/n-X2sum)
b=(Ysum-k*Xsum)/n
print('the line is y=%f*x+%f' % (k,b) )
其运行输出是:
the line is y=1.978214*x+1.112857
这个是数据和拟合的函数图像
现在说明我们前面段算法没有什么问题。
4 总结
通过这么一个简单的学习算法,我们知道,机器学习(统计学习)其实就是我们的数学。包括这里的运算,其实都可以在大学的数学专业或者理工类研究生的数学课程中学习到。学好数理化,走遍全天下