最小二乘法:
最优性质:在所有无偏线性估计中,最小二乘法的方差最小。
给定一组数据,得到拟合函数,拟合函数所对应的函数值与原数据值之间的误差(残差)
范数(残差平方和)最小时,相似度最高,拟合更好。
拟合函数
目的:
得到一组参数
举例:用多项式去拟合正弦函数+正态分布的噪音(数据点)
scipy提供的最小二乘法函数:scipy.optimize包里面的leastsq函数
matplotlib.pyplot包里面的plot函数绘制折线图
%matplotlib inline是一个魔法函数(Magic Functions):当输入plt.plot(x,y_1)后,不必再输入 plt.show(),图像将自动显示出来
import numpy as np
import scipy as sp
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
%matplotlib inline
#正弦函数
def real_func(x):
return np.sin(2*np.pi*x)
#多项式
def fit_func(p,x):
f=np.polyld(p) #np.polyld([1 2 3])
return f(x)
#残差
def residuals_func(p,x,y):
ret=fit_func(p,x)-y
return ret
#正态分布噪音
x=np.linspace(0,1,10) #10个点
x_points=np.linspace(0,1,100)
y_=real_func(x)
y=[np.random.normal(0,0.1)+y1 for y1 in y_] #正弦函数值加上正态分布噪音的目标函数值
def fitting(m=0): #m为多项式次数
p_init=np.random.rand(m+1) #随机初始化多项式参数
p_lsp=leastsq(residuals_func,p_init,args=(x,y))
print('Fitting Parameters:'p_lsp[0])
plt.plot(x_points,real_func(x_points),label='real') #画正弦函数曲线
plt.plot(x_points,fit_func(p_lsp[0],x_points),label='fitted cruve') #最优的多项式参数p_lsp[0]
plt.plot(x,y,'bo',label='noise')
plt.legend()
return p_lsp #将p_lsp的值返回给函数fitting(m=0)
用法:直接调用函数fitting(M= )即可,M为多项式次数
过拟合时,引入正则化项(regularizer),降低过拟合
正则化可以为参数向量的L2范数或者L1范数。
regularization=0.0001
#正则化
def residuals_func_regularization(p,x,y):
ret=fit_func(p,x)-y
ret=np.append(ret,np.sqrt(0.5*regularization*np.square(p)))
return ret
#最小二乘法+正则化=求最优
p_init=np.random.rand(9+1)
p_lsp_regularization=leastsq(residuals_func_regularization,p_init,args=(x,y))
plt.plot(x_points,real_func(x_points),label='real')
plt.plot(x_points,fit_func(fitting(M=9)[0],x_points),label='fitted cruve') #给定参数fitting(M=9)[0]
plt.plot(
x_points,
fit_func(p_lsq_regularization[0],x_points),
label='regularization')
plt.plot(x,y,'bo',label='noise')
plt.legend()
说明:
fitting(M=9)[0]或者p_lsq[0]表示的是参数数组
fitting(M=9)或者p_lsq由参数数组和另外一个参数组成。
用法:直接加入正则化项,对原先的参数多项式拟合曲线进行正则化后的最小二乘法求优。输入正则化参数regularization= 即可