线性回归的求解
介绍
本节我们利用前面所学的PyTorch知识, 完成线性回归问题的求解
技能点:
- 损失的定义
- 优化器的定义
- 模型的训练
线性回归的求解
首先, 让我们来模拟一下,线性回归所需的数据集合
import numpy as npfrom sklearn import datasetsimport matplotlib.pyplot as pltX_numpy,Y_numpy = datasets.make_regression(n_samples=100,n_features=1,noise=20,random_state=4)plt.plot(X_numpy,Y_numpy,"ro")
如上, 我们初始化了一个数据集合.从图中可以看出,该数据集合大致上是呈线性分布.
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
这个案例的目的就是寻找一个良好的函数表达式,该函数表达式能够很好的描述上面数据点的分布,即对上面数据点进行拟合.
在使用PyTorch求解模型之前,我们需要将上面的数据集转成PyTorch认识的张量
# 将numpy转成pytorch的Tensor张量import torchimport torch.nn as nnX = torch.from_numpy(X_numpy.astype(np.float32))Y = torch.from_numpy(Y_numpy.astype(np.float32))Y = Y.view(100,1)print(X.size())print(Y.size())
线性函数模型的定义
# 定义模型n_samples,n_features = X.size()model = nn.Linear(n_features,n_features)print(model)
定义优化器和损失函数
# 定义梯度优化器learning_rate = 0.01optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)print(optimizer)# 定义loss损失函数loss = nn.MSELoss()
最后让我们进行模型的训练,即将数据传入模型中, 然后利用梯度下降算法不断的迭代, 找到最佳的模型.
n_iters = 100for epoch in range(n_iters):# 正向传播预测pred = model(X)# 计算损失函数l = loss(Y,pred)# 计算梯度l.backward()optimizer.step()# 清空梯度optimizer.zero_grad()# 打印每一次的结果if epoch%2 == 0:w,b = model.parameters()print(f"epoch:{epoch},w={w[0][0].item()}")predicted = model(X).detach().numpy()plt.plot(X_numpy,Y_numpy,"ro")plt.plot(X_numpy,predicted,"b")plt.show()
