梯度下降求解回归问题

今天用梯度下降的方法求解一个y=ax+b类型的问题

#导入包
import numpy as np
import matplotlib.pyplot as plt

生成数据

X=np.linspace(-1,6,101)
np.random.seed(1)
Y=2*X+1+np.random.random(size=X.shape)*2
plt.scatter(X,Y)

在这里插入图片描述
生成数据之后,需要定义损失函数:

def J(a,b,x,y):
    s=np.sum((y-a*x-b)**2)
    return s/(2*len(x))

然后分别对a,b求偏导:


a_fir=0
b_fir=0
a_sec=0.5
b_sec=1.0
rate=0.12
n_iter=500
i=0
while i<n_iter:
    plt.plot(b_sec,J(a_sec,b_sec,X,Y),color='r',marker='+')
    gda=(J(a_sec,b_fir,X,Y)-J(a_fir,b_fir,X,Y))/(a_sec-a_fir)
    gdb=(J(a_fir,b_sec,X,Y)-J(a_fir,b_fir,X,Y))/(b_sec-b_fir)
    a_fir=a_sec
    b_fir=b_sec
    a_sec-=rate*gda
    b_sec-=rate*gdb
    print(a_sec,b_sec)
    if abs(gda)<1e-6 and abs(gdb)<1e-6:
         break
    i+=1
print(a_sec,b_sec)
plt.show()

这里我的学习率是0.12,循环次数为500,最后结果为2,2

完整代码与运行结果如下

X=np.linspace(-1,6,101)
np.random.seed(1)
Y=2*X+1+np.random.random(size=X.shape)*2
plt.scatter(X,Y)

def J(a,b,x,y):
    s=np.sum((y-a*x-b)**2)
    return s/(2*len(x))

a_fir=0
b_fir=0
a_sec=0.5
b_sec=1.0
rate=0.12
n_iter=500
i=0
while i<n_iter:
    plt.plot(b_sec,J(a_sec,b_sec,X,Y),color='r',marker='+')
    gda=(J(a_sec,b_fir,X,Y)-J(a_fir,b_fir,X,Y))/(a_sec-a_fir)
    gdb=(J(a_fir,b_sec,X,Y)-J(a_fir,b_fir,X,Y))/(b_sec-b_fir)
    a_fir=a_sec
    b_fir=b_sec
    a_sec-=rate*gda
    b_sec-=rate*gdb
    print(a_sec,b_sec)
    if abs(gda)<1e-6 and abs(gdb)<1e-6:
         break
    i+=1
print(a_sec,b_sec)
plt.show()

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值