长沙网站排名技术,从事网站美工建设,亚马逊雨林图片,hao123从网上开始文章目录 #x1f966;介绍#x1f966;基本知识#x1f966;代码实现#x1f966;完整代码#x1f966;总结 #x1f966;介绍 线性回归是统计学和机器学习中最简单而强大的算法之一#xff0c;用于建模和预测连续性数值输出与输入特征之间的关系。本博客将深入探讨线性… 文章目录 介绍基本知识代码实现完整代码总结 介绍 线性回归是统计学和机器学习中最简单而强大的算法之一用于建模和预测连续性数值输出与输入特征之间的关系。本博客将深入探讨线性回归的理论基础、数学公式以及如何使用PyTorch实现一个简单的线性回归模型。 基本知识
线性回归的数学基础 线性回归的核心思想是建立一个线性方程它表示了自变量输入特征与因变量输出之间的关系。这个线性方程通常表示为
其中 y y y 是因变量 x 1 , x 2 , … , x p x_1, x_2, \ldots, x_p x1,x2,…,xp 是自变量 b 0 , b 1 , b 2 , … , b p b_0, b_1, b_2, \ldots, b_p b0,b1,b2,…,bp 是模型的参数 p p p 是特征的数量。我们的目标是找到最佳的参数值以最小化模型的误差。
损失函数 为了找到最佳参数我们需要定义一个损失函数来度量模型的性能。在线性回归中最常用的损失函数是均方误差MSE它表示了模型预测值与实际值之间的平方差的平均值 其中 n n n 是样本数量 y i y_i yi 是实际值 y ^ i \hat{y}_i y^i 是模型的预测值。
梯度下降优化 为了最小化损失函数我们使用梯度下降算法。梯度下降通过计算损失函数相对于参数的梯度并迭代地更新参数以减小损失。更新规则如下 其中 b j b_j bj 是第 j j j个参数 α \alpha α 是学习率 ∂ ∂ b j M S E \frac{\partial}{\partial b_j} MSE ∂bj∂MSE 是损失函数对参数 b j b_j bj的偏导数。
代码实现
如果你想知道实现线性回归的大体步骤下图可以充分进行说明
准备数据设计模型计算 y ^ i \hat{y}_i y^i构造损失和优化器训练周期前向反向 更新
本节还是以刘二大人的视频讲解为例结尾会设置传送门
class LinearModel(torch.nn.Module):def __init__(self):super(LinearModel, self).__init__() # 调用父类的构造函数self.linear torch.nn.Linear(1, 1) # 参数详情下图展示def forward(self, x):y_pred self.linear(x) # x代表输入样本的张量return y_pred
model LinearModel()所以模型类都要继承Module此类主要包含两个函数一个是构造函数初始化对象时调用另一个是前向计算 好奇的小伙伴会思考为何没有反向backward这是因为Module会帮你进行但是如果后期自己有更高效的方法可以自行设置。 第一个参数 in_features这是输入特征的数量。在这里表示我们的模型只有一个输入特征。如果你有多个输入特征你可以将这个参数设置为输入特征的数量。 第二个参数 out_features这是输出特征的数量。这表示我们的模型将生成一个输出。在线性回归中通常只有一个输出因为我们试图预测一个连续的数值。 第三个参数意思是要不要偏置量。默认true
通常情况下特征代表列比如我们有一个n×2的y和一个n×3的x那么我们需要一个3×2的权重有的书中会在两边做转置但无论咋样目的都是为了让这个矩阵乘法成立
criterion torch.nn.MSELoss(size_averageFalse) # 使用均方误差损失
optimizer torch.optim.SGD(model.parameters(), lr0.01) # 使用随机梯度下降优化器model.parameters() 用于告诉优化器哪些参数需要在训练过程中进行更新这包括模型的权重和偏置项等。在线性回归示例中模型的参数包括权重和偏置项。
优化器的选择有许多大家可以都试试看看
之后就进行训练了
for epoch in range(1000):y_pred model(x_data)loss criterion(y_pred, y_data) print(epoch, loss.item())optimizer.zero_grad() # 归零loss.backward() # 反向optimizer.step() # 更新
print(w , model.linear.weight.item())
print(b , model.linear.bias.item())
x_test torch.Tensor([[4.0]])
y_test model(x_test)
print(y_pred , y_test.data)完整代码
x_data torch.Tensor([[1.0], [2.0], [3.0]])
y_data torch.Tensor([[2.0], [4.0], [6.0]])
class LinearModel(torch.nn.Module):def __init__(self):super(LinearModel, self).__init__() self.linear torch.nn.Linear(1, 1)def forward(self, x):y_pred self.linear(x) return y_pred
model LinearModel()
criterion torch.nn.MSELoss(size_averageFalse)
optimizer torch.optim.SGD(model.parameters(), lr0.01)
for epoch in range(1000):y_pred model(x_data)loss criterion(y_pred, y_data) print(epoch, loss.item())optimizer.zero_grad() loss.backward()optimizer.step()
print(w , model.linear.weight.item())
print(b , model.linear.bias.item())
x_test torch.Tensor([[4.0]])
y_test model(x_test)
print(y_pred , y_test.data)
predicted model(x_data).detach().numpy()
plt.scatter(x_data, y_data, labelOriginal data)
plt.plot(x_data, predicted, labelFitted line, colorr)
plt.legend()
plt.show()运行结果如下 总结 在本篇博客中我们使用PyTorch实现了一个简单的线性回归模型并使用随机生成的数据对其进行了训练和可视化。线性回归是一个入门级的机器学习模型但它为理解模型训练和预测的基本概念提供了一个很好的起点。 挑战与创造都是很痛苦的但是很充实。