线性回归的求解
介绍
本节我们利用前面所学的PyTorch知识, 完成线性回归问题的求解
技能点:
- 损失的定义
- 优化器的定义
- 模型的训练
线性回归的求解
首先, 让我们来模拟一下,线性回归所需的数据集合
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
X_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 torch
import torch.nn as nn
X = 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.01
optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)
print(optimizer)
# 定义loss损失函数
loss = nn.MSELoss()
最后让我们进行模型的训练,即将数据传入模型中, 然后利用梯度下降算法不断的迭代, 找到最佳的模型.
n_iters = 100
for 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()