目录
3.2 线性回归从零开始实现
一 ,简介
1. 原理
2. 步骤
3. 优缺点
4. 应用场景
二 ,代码展现
1. 生成数据集(完整代码)
2. 各个函数解析
2.1 torch.normal()函数
2.2 torch.matmul()函数
2.3 d2l.plt.scatter()函数
三 ,总结
深度学习线性回归的原理是基于神经网络和线性回归的结合。它使用神经网络来构建一个复杂的非线性模型,同时保持线性回归的简单性和可解释性。
在深度学习线性回归中,通常使用全连接神经网络(Fully Connected Neural Network)作为基础结构。输入数据经过一系列的线性变换和非线性激活函数,最终输出预测结果。与传统的线性回归不同,深度学习线性回归可以自动学习特征之间的复杂交互和组合,而不需要手动选择或设计特征。
深度学习线性回归的训练过程与传统神经网络的训练过程类似,使用梯度下降算法优化模型的参数,以最小化预测误差(如均方误差)。在训练过程中,通过反向传播算法计算梯度,并使用优化器(如Adam、SGD等)更新权重和偏置项。
深度学习线性回归的优点是可以处理高维、复杂的非线性数据,并且具有自动特征选择和组合的能力。然而,与传统的线性回归相比,深度学习线性回归需要更多的参数和计算资源,并且可能更容易过拟合。因此,在选择是否使用深度学习线性回归时,需要根据具体问题和数据集的特点进行权衡。
线性回归从零开始实现步骤包括以下内容:
以上是线性回归从零开始实现的基本步骤,具体实现细节可能会根据问题和数据集的不同而有所差异。
线性回归的优点:
然而,线性回归也存在一些缺点:
线性回归的应用场景包括但不限于:
以上只是部分应用场景,线性回归模型的应用非常广泛,具体应用取决于数据的特征和业务需求。
# 线性回归从零开始实现
# 生成数据集
# 导入必要的库
import matplotlib.pyplot as plt
import random
import torch
from d2l import torch as d2l
# 定义一个生成合成数据的函数
def synthetic_data(w, b, num_examples): # 函数参数包括权重w、偏置b和数据点数量num_examples
# 生成y=Xw+b+噪声满足线性关系y=Xw+b的数据,并添加噪声
X = torch.normal(0, 1, (num_examples, len(w))) # 创建一个形状为(num_examples, len(w))的张量X,元素值为从标准正态分布中抽取的随机数
y = torch.matmul(X, w) + b # 使用矩阵乘法计算y的值,y = X * w + b
y += torch.normal(0, 0.01, y.shape) # 在y的值上添加从标准正态分布中抽取的随机噪声,噪声的标准差为0.01
return X, y.reshape((-1, 1)) # 返回X和y。y被重新整形为(-1, 1)的形状,这是因为matplotlib在绘图时需要这样的形状
# 定义真实的权重和偏置值
true_w = torch.tensor([2, -3.4]) # 真实的权重w为[2, -3.4]的张量
true_b = 4.2 # 真实的偏置b为4.2的标量
# 使用上面定义的函数生成数据集
features, labels = synthetic_data(true_w, true_b, 1000) # 生成1000个数据点作为训练或测试样本,特征为X,标签为y(即labels)
print('features:', features[0],'\nlabel:', labels[0])
d2l.set_figsize()
d2l.plt.scatter(features[:, (1)].detach().numpy(), labels.detach().numpy(), 1)
# 这行代码也是从d2l库中调用的。它使用散点图来可视化特征和标签。#
# features[:, (1)].detach().numpy()选取了所有数据点的第二个特征(索引为1,因为索引是从0开始的)并转换为NumPy数组。
# #.detach()是PyTorch中的方法,用于从计算图中分离张量,这样张量就不会追踪其历史计算,这在进行绘图等操作时是很有用的。
# labels.detach().numpy()将标签转换为NumPy数组。这里的1表示散点的大小。
plt.show()
normal(mean, std, *, generator=None, out=None)
参数说明:
mean (Tensor)
: 每个输出元素的均值。它是一个张量,其中包含各个分布的均值。std (Tensor)
: 每个输出元素的标准差。它也是一个张量,其中包含各个分布的标准差。*
: 表示后面的参数是关键字参数。generator
: 可选参数,一个伪随机数生成器。out
: 可选参数,输出张量。注意事项:
mean
和std
的形状不必匹配,但它们的元素总数必须相同。如果形状不匹配,将使用mean
的形状作为返回输出张量的形状。std
是一个CUDA tensor,该函数将同步其设备与CPU。matmul(input, other, *, out=None) -> Tensor
参数说明:
input (Tensor)
: 输入张量。other (Tensor)
: 另一个张量。*
: 表示后面的参数是关键字参数。out (Tensor, optional)
: 可选参数,输出张量。行为取决于张量的维度如下:
input
是一个(j × 1 × n × n)
张量,而other
是一个(k × n × n)
张量,则out
将是一个(j × k × n × n)
张量。scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
参数说明:
x, y:这些是您要在散点图中表示的数据点的x和y坐标。
s:散点的面积,以像素为单位。这通常用于根据数据点的值进行大小调整。
c:用于颜色映射的单个值或数组,通常表示颜色或数据点的值。
marker:散点的形状。例如,'o'
表示圆形,'.'
表示点,','
表示像素等。
cmap:颜色映射对象或名称。这决定了如何根据c
参数的值映射颜色。
norm:用于映射到给定范围的归一化对象。这通常与cmap
一起使用,以控制颜色映射的范围。
vmin, vmax:这些参数指定了归一化对象的下限和上限。它们与norm
一起使用来控制颜色映射的范围。
alpha:散点的透明度。值范围从0(完全透明)到1(完全不透明)。
linewidths:用于绘制边框线的宽度。当不为None时,这会使散点变为带边框的圆圈。
edgecolors:用于边框线的颜色。这可以是单一的颜色或颜色数组,与数据点一一对应。
plotnonfinite:如果为True,则非有限数值的数据点将被绘制。默认为False。
data:提供给所有数据的原始数据的字典。这通常在传递给函数的数据不是直接参数时使用。
kwargs:其他关键字参数将传递给collections.PathCollection
的构造函数,允许您自定义散点图的其他方面。例如,您可以指定label
来在图例中标识这些点等。
这段代码的主要目的是生成数据集,并使用散点图可视化其特征和标签。通过这种方式,可以直观地观察到数据分布和特征之间的关系。此外,代码还演示了如何使用PyTorch进行矩阵运算和NumPy数组转换,以及如何使用d2l库中的函数进行绘图操作。
之后我会更新,线性回归的读取数据集,初始化模型参数,定义模型,定义模型,定义损失函数,定义优化算法,训练等步骤。