使用最小二乘法拟合sin(2pix)函数,
#目标函数
def real_func(x):
return np.sin(2*np.pi*x)
#多项式
def fit_func(p,x):
f=np.poly1d(p)
#numpy.poly1d([1,2,3]) 生成 $1x^2+2x^1+3x^0$*
return f(x)
#残差
def residuals_func(p,x,y):
ret=fit_func(p,x)-y
return 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()
return p_lsq
p_lsq_0=fitting(M=9)
#经过了每个数据点,过拟合
![当M为9是出现的过拟合现象](https://img-blog.csdnimg.cn/20191229210128201.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JsbG9ycw==,size_16,color_FFFFFF,t_70)```过拟合现象出现,我们需要使用正则化来降低过拟合,
```python
#参数可调
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)))#L2范数
return ret
def residuals_func_regularization1(p,x,y):
ret=fit_func(p,x)-y
ret=np.append(ret,regularization*np.abs(p))#L1范数
return ret
#最小二乘法,加正则化
p_init=np.random.rand(9+1)
p_lsq_regularization=leastsq(residuals_func_regularization,p_init,args=(x,y))
p_lsq_regularization1=leastsq(residuals_func_regularization1,p_init,args=(x,y))
plt.plot(x_points,real_func(x_points),label='real')
plt.plot(x_points,fit_func(p_lsq_0[0],x_points),label='fitted curve')
plt.plot(
x_points,
fit_func(p_lsq_regularization[0], x_points),
label='regularization_L2')
plt.plot(x, y, 'bo', label='noise')
plt.legend()
plt.plot(x_points,real_func(x_points),label='real')
plt.plot(x_points,fit_func(p_lsq_0[0],x_points),label='fitted curve')
plt.plot(
x_points,
fit_func(p_lsq_regularization1[0], x_points),
label='regularization_L1')
plt.plot(x, y, 'bo', label='noise')
plt.legend()
但随着参数regularization=0.0001的变化,拟合的函数效果也在变化,所以机器学习的参数需要不断尝试。