1、背景知识html
“最小二乘法”出现的历史背景是颇有意思的。(如下文字摘录维基百科)python
1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星。通过40天的跟踪观测后,因为谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置。随后全世界的科学家利用皮亚齐的观测数据开始寻找谷神星,可是根据大多数人计算的结果来寻找谷神星都没有结果。时年24岁的高斯也计算了谷神星的轨道。奥地利天文学家海因里希·奥尔伯斯根据高斯计算出来的轨道从新发现了谷神星。app
高斯使用的最小二乘法的方法发表于1809年他的著做《天体运动论》中,而法国科学家勒让德于1806年独立发现“最小二乘法”,但因不为时人所知而默默无闻。两人曾为谁最先创立最小二乘法原理发生争执。框架
1829年,高斯提供了最小二乘法的优化效果强于其余方法的证实,见高斯-马尔可夫定理。函数
2、知识运用工具
“最小二乘法”的核心就是保证全部数据误差的平方和最小。(“平方”的在古时侯的称谓为“二乘”)优化
假设咱们收集到一些战舰的长度与宽度数据spa
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
长度(m) | 208 | 152 | 113 | 227 | 137 | 238 | 178 | 104 | 191 | 130 |
宽度(m) | 21.6 | 15.5 | 10.4 | 31.0 | 13.0 | 32.4 | 19.0 | 10.4 | 19.0 | 11.8 |
根据这些数据咱们用python画出散点图:orm
画散点图的代码以下:htm
# -*- coding: utf-8 -*
import numpy as np
import os
import matplotlib.pyplot as plt
def drawScatterDiagram(fileName):
#改变工做路径到数据文件存放的地方
os.chdir("d:/workspace_ml")
xcord=[];ycord=[]
fr=open(fileName)
for line in fr.readlines():
lineArr=line.strip().split()
xcord.append(float(lineArr[1]));ycord.append(float(lineArr[2]))
plt.scatter(xcord,ycord,s=30,c='red',marker='s')
plt.show()
假如咱们取前两个点(238,32.4)(152, 15.5)就能够获得两个方程
152*a+b=15.5
328*a+b=32.4
那样的话,咱们能够获得这样的拟合图:
好了,新的问题来了,这样的a,b是否是最优解呢?用专业的说法就是:a,b是否是模型的最优化参数?在回答这个问题以前,咱们先解决另一个问题:a,b知足什么条件才是最好的?答案是:保证全部数据误差的平方和最小。至于原理,咱们会在后面讲,先来看看怎么利用这个工具来计算最好的a和b。
假设全部数据的平方和为M,则
咱们如今要作的就是求使得M最小的a和b。请注意这个方程中,咱们已知yi和xi
那其实这个方程就是一个以(a,b)为自变量,M为因变量的二元函数。
回想一下高数中怎么对一元函数就极值。咱们用的是导数这个工具。那么在二元函数中,
咱们依然用导数。只不过这里的导数有了新的名字“偏导数”。偏导数就是把两个变量中的一个视为常数来求导。
经过对M来求偏导数,咱们获得一个方程组
=0
=0
这两个方程中xi和yi都是知道的。
很容易就求得a和b了。因为采用的是维基百科的数据,我这里就直接用答案来画出拟合图像:
# -*- coding: utf-8 -*
import numpy as np
import os
import matplotlib.pyplot as plt
def drawScatterDiagram(fileName):
#改变工做路径到数据文件存放的地方
os.chdir("d:/workspace_ml")
xcord=[];ycord=[]
fr=open(fileName)
for line in fr.readlines():
lineArr=line.strip().split()
xcord.append(float(lineArr[1]));ycord.append(float(lineArr[2]))
plt.scatter(xcord,ycord,s=30,c='red',marker='s')
#a=0.1965;b=-14.486
a=0.1612;b=-8.6394
x=np.arange(90.0,250.0,0.1)
y=a*x+b
plt.plot(x,y)
plt.show()
3、原理探究
数据拟合中,为何要让模型的预测数据与实际数据之差的平方而不是绝对值和最小来优化模型参数?
这个问题已经有人回答了,见连接(http://blog.sciencenet.cn/blog-430956-621997.html)
我的感受这个解释是很是有意思的。特别是里面的假设:全部偏离f(x)的点都是有噪音的。
一个点偏离越远说明噪音越大,这个点出现的几率也越小。那么偏离程度x与出现几率f(x)知足什么关系呢?——正态分布。
已知N个点(用D来表示),求直线(用h来表示)出现的几率就能够表示为:P(h|D)
根据贝叶斯定理:P(h|D)=P(D|h)*P(h)/P(D)即P(h|D)∝P(D|h)*P(h) (∝表示“正比于”)
这就是一个生成模型了——由直线h生成点集D。
咱们再做一个假设:h生成D中的每个点都是独立的(若是了解贝叶斯文本分类的话,这里就很好理解了),那么P(D|h)=p(d1|h)*p(d2|h)…
结合前面正态分布,咱们能够写出这样的式子:p(di|h)∝ exp(-(ΔYi)^2)
那么P(D|h)∝EXP[-(ΔY1)^2]* EXP[-(ΔY2)^2] * EXP[-(ΔY3)^2] * ..
又由于:ea*eb*ec=ea+b+c
因此p(D|h)∝ EXP{-[(ΔY1)^2 +(ΔY2)^2 + (ΔY3)^2 + ..]}
咱们知道f(x)=ex的分布图像为:
由于e的指数永远小于0,因此,想要p(D|h)最大,就必须使[(ΔY1)^2 + (ΔY2)^2 + (ΔY3)^2 + ..]无限接近于0,即:最大化p(D|h)就是要最小化[(ΔY1)^2 + (ΔY2)^2 + (ΔY3)^2 + ..]
到此,最小二乘法的原理获得了诠释。
4、最小二乘法与梯度降低法
最小二乘法跟梯度降低法都是经过求导来求损失函数的最小值,那它们有什么区别呢。
相同
1.本质相同:两种方法都是在给定已知数据(independent & dependent variables)的前提下对dependent variables算出出一个通常性的估值函数。而后对给定新数据的dependent variables进行估算。
2.目标相同:都是在已知数据的框架内,使得估算值与实际值的总平方差尽可能更小(事实上未必必定要使用平方),估算值与实际值的总平方差的公式为:
其中为第i组数据的independent variable,
为第i组数据的dependent variable,
为系数向量。
不一样
1.实现方法和结果不一样:最小二乘法是直接对求导找出全局最小,是非迭代法。而梯度降低法是一种迭代法,先给定一个
,而后向
降低最快的方向调整
,在若干次迭代以后找到局部最小。梯度降低法的缺点是到最小点的时候收敛速度变慢,而且对初始点的选择极为敏感,其改进大可能是在这两方面下功夫。
5、拓展延伸
上面讲的都是二维的状况,也就是只有一个自变量。但现实世界中影响最后结果的都是多种因素的叠加,即自变量会有多个的状况。
对于通常N元线性函数,用《线性代数》中的逆矩阵来求解就OK了;因为暂时没有找到合适的例子,就做为一个引子,留在这里了。
固然天然界更多的是多项式拟合,而非简单的线性,那就是更高级的内容了。