机器学习之最小二乘法

使用最小二乘法拟合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()


L2范数作为正则化参数

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的变化,拟合的函数效果也在变化,所以机器学习的参数需要不断尝试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值