手写梯度下降拟合二次线性模型

 

这里用最简单的Loss Function来推写一个用梯度下降拟合二次线性模型的代码

Loss = \sum (\hat{y} - (W_1 * x^2 + W_2 * x + b))^2

首先,我们随意设计一个二次线性模型:

# 实际曲线
x_orgin = np.linspace(-10,10,100)
y_orgin = 5.0 * x_orgin**2 + 4.0 * x_orgin - 23.0

plt.plot(x_orgin,y_orgin)
plt.show()

接下来我们自己制造一些数据,当然,我们给数据增加一些噪音,使得数据变得没那么“准确”,不然我们还拟合啥

# 增加噪音后的实验数据
x_data = np.array([random.uniform(-10,10) for _ in range(100)])
x_data.sort()
y_data = [5.0 * i**2 + 4.0 * i - 23.0 + random.uniform(-30,30) for i in x_data]

plt.scatter(x_data,y_data)
plt.show()

 最后就是利用梯度下降来寻找参数

x = np.array([random.uniform(-10,10) for _ in range(100)])
y = [5.0 * i**2 + 4.0 * i - 23.0 + random.uniform(-30,30) for i in x]

w1 = 3
w2 = 3
b = 20
lr = 0.0001
iteration = 1000

for _ in range(iteration):
    gd_w1 = 0.0
    gd_w2 = 0.0
    gd_b = 0.0
    for i in range(len(x)):
        gd_w1 += 2.0 * (y[i]-w1*(x[i]**2)-w2*x[i]-b)*(-x[i]*2)
        gd_w2 += 2.0 * (y[i]-w1*(x[i]**2)-w2*x[i]-b)*(-x[i])
        gd_b += 2.0 * (y[i]-w1*(x[i]**2)-w2*x[i]-b)*(-1.0)
#     print(gd_w1,gd_w2,gd_b)

    w1 = w1 - lr*gd_w1
    w2 = w2 - lr*gd_w2
    b = b - lr*gd_b
#     print(w1,w2,b)

x.sort()
y = w1*x**2 + w2*x + b

print(w1, w2, b)
plt.figure()
plt.plot(x,y,color='red')
plt.plot(x_orgin,y_orgin)
plt.scatter(x_data,y_data)
plt.show()

此时的W_1, W_2, b

4.773247363826946   3.886623681913472   -10.806697288331906

红色的线是拟合的曲线,蓝色的线是原始给出的曲线,各个点是增加噪音后的数据集,这里只训练了1000次,提高iteration能增加拟合度

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值