这里用最简单的Loss Function来推写一个用梯度下降拟合二次线性模型的代码
首先,我们随意设计一个二次线性模型:
# 实际曲线
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()
此时的为
4.773247363826946 3.886623681913472 -10.806697288331906
红色的线是拟合的曲线,蓝色的线是原始给出的曲线,各个点是增加噪音后的数据集,这里只训练了1000次,提高iteration能增加拟合度