最小二乘法(Least squares又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。 ---来自百度百科
“最小二乘法”的核心就是保证所有数据偏差的平方和最小。
根据测量数据来分析变量之间相互关系的方法称为回归分析法,即工程上所说的拟合问题,所得的关系式即为经验公式或拟合方程。根据变量个数及变量之间关系的不同,回归分析分为一元线性回归(直线拟合)、一元非线性回归(曲线拟合)、多元线性回归和多项式回归等。
最常见的拟合方法是最小二乘法。最小二乘法的出发点是使实际测量数据yi与拟合直线上对应的估计值的残差的平方和为最小。即
对于最简单情况:一元线性拟合 y=a+bx,根据最小二乘法有
为使M最小只需要对其求a、b偏导,然后令偏导数等于0即可就出a、b值:
=0
=0 其中a、b通过最小二乘法求得为:
算法实现(python版):
import matplotlib.pyplot as plt
x =[1,2,3,5,6,12,11,13]
y =[4,5,8,13,12,23,20,22]
average_x=float(sum(x))//len(x)
average_y=float(sum(y))/len(y)
x_sub=map((lambda x:x-average_x),x)
y_sub=map((lambda x:x-average_y),y)
x_sub_pow2=map((lambda x:x**2),x_sub)
y_sub_pow2=map((lambda x:x**2),y_sub)
x_y=map((lambda x,y:x*y),x_sub,y_sub)
a=float(sum(x_y))/sum(x_sub_pow2)
b=average_y-a*average_x
plt.xlabel('X')
plt.ylabel('Y')
plt.plot(x, y, '*')
plt.plot([0,15],[0*a+b,15*a+b])
plt.grid()
plt.show()
对于多元线性回归、多元非线性回归都可以转换成线性回归方式求解,而使用矩阵方式得到的结果更利于泛化。当时多元回归模型时,对应的系数矩阵(a,b1,b2,b3,.....bn)同样可使是用上面的求解表示。
算法实现(python版):
from numpy import *
from random import *
import matplotlib.pyplot as plt
def Data():
x = arange(-1,1,0.02)
y = ((x*x-1)**2+2)*(sin(x*3)+0.7*cos(x*1.2))
xr=[];yr=[];i = 0
for xx in x:
yy=y[i]
d=float(randint(80,120))/100
i+=1
xr.append(xx*d)
yr.append(yy*d)
return x,y,xr,yr
def MAT(x,y,order):
X=[]
for i in range(order+1):
X.append(x**i)
X=mat(X).T
Y=array(y).reshape((len(y),1))
return X,Y
def fig(x1,y1,x2,y2):
plt.xlabel('X')
plt.ylabel('Y')
plt.plot(x1,y1,color='g',linestyle='-',marker='')
plt.plot(x2,y2,color='m',linestyle='',marker='.')
plt.grid()
plt.show()
def Solve():
x,y,xr,yr = Data()
X,Y = MAT(x,y,9)
XT=X.transpose()
B=dot(dot(linalg.inv(dot(XT,X)),XT),Y)
myY=dot(X,B)
fig(x,myY,xr,yr)
Solve()
数据拟合中,为什么要让模型的预测数据与实际数据之差的平方而不是绝对值和最小来优化模型参数?