线性回归的求解

介绍

本节我们利用前面所学的PyTorch知识, 完成线性回归问题的求解

技能点:

  1. 损失的定义
  2. 优化器的定义
  3. 模型的训练

线性回归的求解

首先, 让我们来模拟一下,线性回归所需的数据集合

  1. import numpy as np
  2. from sklearn import datasets
  3. import matplotlib.pyplot as plt
  4. X_numpy,Y_numpy = datasets.make_regression(n_samples=100,n_features=1,noise=20,random_state=4)
  5. plt.plot(X_numpy,Y_numpy,"ro")

如上, 我们初始化了一个数据集合.从图中可以看出,该数据集合大致上是呈线性分布.

  1. pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple

这个案例的目的就是寻找一个良好的函数表达式,该函数表达式能够很好的描述上面数据点的分布,即对上面数据点进行拟合.

在使用PyTorch求解模型之前,我们需要将上面的数据集转成PyTorch认识的张量

  1. # 将numpy转成pytorch的Tensor张量
  2. import torch
  3. import torch.nn as nn
  4. X = torch.from_numpy(X_numpy.astype(np.float32))
  5. Y = torch.from_numpy(Y_numpy.astype(np.float32))
  6. Y = Y.view(100,1)
  7. print(X.size())
  8. print(Y.size())

线性函数模型的定义

  1. # 定义模型
  2. n_samples,n_features = X.size()
  3. model = nn.Linear(n_features,n_features)
  4. print(model)

定义优化器和损失函数

  1. # 定义梯度优化器
  2. learning_rate = 0.01
  3. optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)
  4. print(optimizer)
  5. # 定义loss损失函数
  6. loss = nn.MSELoss()

最后让我们进行模型的训练,即将数据传入模型中, 然后利用梯度下降算法不断的迭代, 找到最佳的模型.

  1. n_iters = 100
  2. for epoch in range(n_iters):
  3. # 正向传播预测
  4. pred = model(X)
  5. # 计算损失函数
  6. l = loss(Y,pred)
  7. # 计算梯度
  8. l.backward()
  9. optimizer.step()
  10. # 清空梯度
  11. optimizer.zero_grad()
  12. # 打印每一次的结果
  13. if epoch%2 == 0:
  14. w,b = model.parameters()
  15. print(f"epoch:{epoch},w={w[0][0].item()}")
  16. predicted = model(X).detach().numpy()
  17. plt.plot(X_numpy,Y_numpy,"ro")
  18. plt.plot(X_numpy,predicted,"b")
  19. plt.show()