三、最小二乘法
最小二乘法(least square
method)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。
Python的最小二乘函数是leastsq。调用方式:
leastsq(func,
x0, args=(), Dfun=None,
full_output=0, col_deriv=0,
ftol=1.49012e-08, xtol=1.49012e-08,
gtol=0.0, maxfev=0,
epsfcn=0.0,factor=100,
diag=None)
---------我是代码的分割线---------------
案例一:
from pylab import *
from numpy import *
from scipy.optimize import leastsq
#fp是真实的函数,v是系数,x是变量。fn是fp函数的一个具体实现,e是误差函数。
fp = lambda v, x: v[0]/(x**v[1])*sin(v[2]*x)
v_real = [1.5, 0.1, 2.]
fn = lambda x: fp(v_real, x)
e = lambda v, x, y:
(fp(v,x)-y)
#设计一个含有噪音的函数
n = 30
xmin = 0.1
xmax = 5
x = linspace(xmin,xmax,n)
y = fn(x) + rand(len(x))*0.2*(fn(x).max()-fn(x).min())
#设计初始值,并调用leastsq函数求解。用args指明变量,maxfev是最多调用函数的次数。
v0 = [3., 1, 4.]
v, success = leastsq(e, v0, args=(x,y),
maxfev=10000)
#绘出真实曲线和拟合曲线
def plot_fit():
'Estimater parameters: ', v
print 'Real
parameters: ', v_real
X =
linspace(xmin,xmax,n*5)
plot(x,y,'ro', X, fp(v,X))
plot_fit()
show()
拟合曲线
拟合值与真实值
案例二:
from numpy import *
from scipy.optimize import
leastsq
import matplotlib.pyplot as
plt
x = arange(0,6e-2,6e-2/30)
A,k,theta = 10, 1.0/3e-2, pi/6
y_true = A*sin(2*pi*k*x+theta)
y_meas = y_true + 2*random.randn(len(x))
def residuals(p, y, x):
A,k,theta =
p
err =
y-A*sin(2*pi*k*x+theta)
return
err
def peval_r(x, p):
return
p[0]*sin(2*pi*p[1]*x+p[2])
p0 = [8, 1/2.3e-2, pi/3]
plsq = leastsq(residuals, p0, args=(y_meas, x))
plt.plot(x,peval_r(x,plsq[0]),x,y_meas,'o',x,y_true)
plt.title('Least-squares fit to noisy data')
plt.legend(['Fit', 'Noisy', 'True'])
plt.show()