我们用最原始的NumPy实现一个有关回归的机器学习任务,而不用PyTorch中的包或类。这种方法的代码可能会多一点,但每一步都是透明的,有利于理解每一步的工作原理。
主要步骤分析如下。
首先,给出一个数组x,然后基于表达式y=3x+2,加上一些噪声数据到达另一组数据y。然后,构建一个机器学习模型,学习表达式y=wx+b的两个参数w、b。利用数组x、y的数据训练模型。
最后,采用梯度下降法,通过多次迭代学习到w、b的值。
通俗一点就是已知一组x,y的值,这些值是满足函数严格一一对应的条件,我们需要通过数据去反推x,y之间存在最满足原始数据的函数关系
import numpy as np
from matplotlib import pyplot as plt
np.random.seed(100)
x = np.linspace(-1,1,100).reshape(100,1)
y = 3 * np.power(x,2) + 2 + 0.2 * np.random.rand(x.size).reshape(100,1)
# drawing
plt.scatter(x,y)
plt.show()
# 初始化参数
w1 = np.random.rand(1,1)
b1 = np.random.rand(1,1)
这里我们取100个随机数
】
学习之后得到的拟合曲线
补充代码如下
# 训练模型
lr = 0.001 # 学习率
for i in range(800):
# 正向传播
y_pred = np.power(x, 2) * w1 + b1
# 定义损失函数
loss = 0.5 * (y_pred - y) ** 2
loss = loss.sum()
# 计算梯度
grad_w = np.sum((y_pred - y) * np.power(x, 2))
grad_b = np.sum(y_pred - y)
# 使用梯度下降更新参数
w1 -= lr * grad_w
b1 -= lr * grad_b
# 可视化结果
plt.plot(x, y_pred, 'r-', label='Predict', linewidth=4)
plt.scatter(x, y, color='blue', marker='o', label='True')
plt.xlim(-1, 1)
plt.ylim(2, 6)
plt.legend()
plt.show()
print("w1:", w1, "b1:", b1)
同时终端把计算出的b1,w1显示出来
与我们设定的w1 = 3,b1 = 2几乎一样,若数据的个数增大至无穷,则这两个参数无限接近设定值。