#coding:utf-8
import numpy as np
import scipy as sp
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
# 目标函数
def real_func(x):return np.sin(2*np.pi*x)# 多项式
def fit_func(p, x):f = np.poly1d(p)# print('f=',f)return f(x)# 残差
def residuals_func(p, x, y):ret = fit_func(p, x) - yreturn ret# 十个点
x = np.linspace(0, 1, 10)
x_points = np.linspace(0, 1, 1000)
# 加上正态分布噪音的目标函数的值
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_lsq = leastsq(residuals_func, p_init, args=(x, y))print('Fitting Parameters:', p_lsq[0])## 可视化plt.plot(x_points, real_func(x_points), label='real')plt.plot(x_points, fit_func(p_lsq[0], x_points), label='fitted curve')plt.plot(x, y, 'bo', label='noise')plt.legend()plt.show()return p_lsq
# M=0
p_lsq_0 = fitting(M=0)
# M=1
p_lsq_1 = fitting(M=1)
# M=3
p_lsq_3 = fitting(M=3)
# M=9
p_lsq_9 = fitting(M=9)
M分别为0,1,3,9时的多项式系数。
M=0,即多项式为常数时
M=1, 即多项式为一次项时
M=3,即多项式为三次项时,可看出拟合的比较不错
M=9时,可看出过拟合了
引入正则化
#加入正则
regularization = 0.0001
def residuals_func_regularization(p, x, y):ret = fit_func(p, x) - yret = np.append(ret, np.sqrt(0.5*regularization*np.square(p))) # L2范数作为正则化项return ret
# 最小二乘法,加正则化项
p_init = np.random.rand(9+1)
p_lsq_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(p_lsq_9[0], x_points), label='fitted curve')
plt.plot(x_points, fit_func(p_lsq_regularization[0], x_points), label='regularization')
plt.plot(x, y, 'bo', label='noise')
plt.legend()
plt.show()
可看出:正则化有效