最小二乘法(Least Square Method)
原理:最小误差平方和
应用:
通过几何中,点和线描述:
函数介绍:
1. numpy.ploy1d(arrary,bool,variable)
import numpy as np
w = [1, 2, 3, 4]
f1 = np.poly1d(w)
f2 = np.poly1d(w, True)
f3 = np.poly1d(w, False, 'z')
print(f1)
print(f2)
print(f3)
2. scipy.optimize.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,
warning=True)
在optimize模块中,使用leastsq()函数可以很快速地使用最小二乘法对数据进行拟合。一般来说,我们只需要前三个参数就够了他们的作用分别是:
前提假设:
目标函数:y=sinx
损失函数:loss = y'-y
'''最小二乘法'''
# _*_ coding: utf-8 _*_
import numpy as np # 引入numpy
import scipy as sp
import pylab as pl
from scipy.optimize import leastsq # 引入最小二乘函数
n = 9 # 多项式次数
# 目标函数
def real_func(x):
return np.sin(2 * np.pi * x)
# 多项式函数
def fit_func(p, x):
f = np.poly1d(p)
return f(x)
# 残差函数
def residuals_func(p, y, x):
ret = fit_func(p, x) - y
return ret
x = np.linspace(0, 1, 9) # 随机选择9个点作为x
x_points = np.linspace(0, 1, 1000) # 画图时需要的连续点
y0 = real_func(x) # 目标函数
y1 = [np.random.normal(0, 0.1) + y for y in y0] # 添加正太分布噪声后的函数
p_init = np.random.randn(n) # 随机初始化多项式参数
plsq = leastsq(residuals_func, p_init, args=(y1, x))
print('Fitting Parameters: ', plsq[0]) # 输出拟合参数
pl.plot(x_points, real_func(x_points), label='real')
pl.plot(x_points, fit_func(plsq[0], x_points), label='fitted curve')
pl.plot(x, y1, 'bo', label='with noise')
pl.legend()
pl.show()
从结果图中观察可得出结论:过拟合
优化方法:
1.调整拟合函数的项数。实验后得到当n=4时,可以得到适当的拟合函数。
2.优化损失函数,通过加上正则化项,来降低过拟合现象。
regularization = 0.001 # 正则化系数lambda
# 残差函数
def residuals_func(p, y, x):
ret = fit_func(p, x) - y
ret = np.append(ret, np.sqrt(regularization) * p) # 将lambda^(1/2)p加在了返回的array的后面
return ret
注意:当系数lambda过大时,会出现欠拟合现象。