(一) 最小二乘法简介:
最小二乘法,也叫最小平方法,在古汉语中“平方”称为“二乘”,“最小”指的是参数的估计值要保证各个观测点与估计点的距离的平方和达到最小。最小二乘作为一种损失函数,在这整个解决方案中,最小二乘法演算为每一方程式的结果中,将残差平方和的总和最小化。最重要的应用是在曲线拟合上。最小平方所涵义的最佳拟合,即残差(残差为:观测值与模型提供的拟合值之间的差距)平方总和的最小化。当问题在自变量有重大不确定性时,那么使用简易回归和最小二乘法会发生问题;在这种情况下,须另外考虑变量-误差-拟合模型所需的方法,而不是最小二乘法。
最小平方问题分为两种:线性或普通的最小二乘法,和非线性的最小二乘法,取决于在所有未知数中的残差是否为线性。线性的最小平方问题发生在统计回归分析中;它有一个封闭形式的解决方案。非线性的问题通常经由迭代细致化来解决;在每次迭代中,系统由线性近似,因此在这两种情况下核心演算是相同的。
最小二乘法所得出的多项式,即以拟合曲线的函数来描述自变量与预计应变量的变异数关系。当观测值来自指数族且满足轻度条件时,最小平方估计和最大似然估计是相同的。最小二乘法也能从动差法得出。回归分析的最初目的是估计模型的参数以便达到对数据的最佳拟合。
(二)最小二乘法实现原理:
__author__ = 'Administrator'
import numpy as np
import matplotlib.pyplot as plt
input = np.array([[1, 3],[2, 5],[3, 7],[4, 10],[5,12]])
m = np.shape(input)[0]
X = np.matrix([np.ones(m), input[:,0]]).T
print(X)
y = np.matrix(input[:,1]).T
print("X.T",X.T,"X.T.dot(X)",X.T*X)
beta=np.linalg.inv(X.T*X)*X.T*y
print(beta)
plt.figure(1)
xx = np.linspace(0, 5, 2)
yy = np.array(beta[0] + beta[1] *xx)
plt.plot(xx, yy.T, color='b')
plt.scatter(input[:,0], input[:,1], color='r')
plt.show()
(三)scipy中最小二乘法应用举例:
__author__ = 'Administrator'
##最小二乘法
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq #引入最小二乘法算法
Xi=np.array([6,2.5,7.2,7.0,5.6,2.6,3.9,2.5,9.5,4.6])
Yi=np.array([5,2.8,6.5,6.7,5.1,4.2,5.0,2.0,10.5,6.5])
def func(p,x):
k,b=p
return k*x+b
def error(p,x,y):
return func(p,x)-y
p0=[1,15] #初始值
Para=leastsq(error,p0,args=(Xi,Yi)) #第一个参数为拟合直线系数。
print(Para)
k,b=Para[0]
print("k=",k,"b=",b)
print("cost:"+str(Para[1]))
print("y="+str(round(k,2))+"x+"+str(round(b,2)))
#画样本点
plt.figure(figsize=(9,6))
plt.scatter(Xi,Yi,color="green",label="sampledata",linewidth=2)
#画拟合直线
x=np.linspace(0,15,150) ##在0-15直接画150个连续点
y=k*x+b ##函数式
plt.plot(x,y,color="red",label="linear ",linewidth=2)
plt.show()