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

 

这里用最简单的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能增加拟合度

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章