线性回归的实现学习

线性回归的实现学习

d2l.stnthetic_data函数

synthetic_data(w, b, num_example)

生成x, y满足关系 y = X w + b + n o i s e y = Xw+b+noise y=Xw+b+noise

data.TensorDataset()

TensorDataset 可以用来对 tensor 进行打包,包装成dataset。就好像 python 中的 zip 功能。该类通过每一个 tensor 的第一个维度进行索引。因此,该类中的 tensor 第一维度必须相等. 另外:TensorDataset 中的参数必须是 tensor

DataLoader
data_iter=torch.utils.data.DataLoader(dataset, batch_size=1, 
                            shuffle=False, sampler=None, 
                            batch_sampler=None, num_workers=0, 
                            collate_fn=None, pin_memory=False, 
                            drop_last=False, timeout=0, 
                            worker_init_fn=None, 
                            multiprocessing_context=None)

dataset (Dataset) – 加载数据的数据集。

batch_size (int, optional) – 每个batch加载多少个样本(默认: 1)。

shuffle (bool, optional) – 设置为True时会在每个epoch重新打乱数据(默认: False).

sampler (Sampler, optional) – 定义从数据集中提取样本的策略。如果指定,则shuffle必须设置成False。

num_workers (int, optional) – 用多少个子进程加载数据。0表示数据将在主进程中加载(默认: 0)

pin_memory:内存寄存,默认为False。在数据返回前,是否将数据复制到CUDA内存中。

drop_last (bool, optional) – 如果数据集大小不能被batch size整除,则设置为True后可删除最后一个不完整的batch。如果设为False并且数据集的大小不能被batch size整除,则最后一个batch将更小。(默认: False)

timeout:是用来设置数据读取的超时时间的,如果超过这个时间还没读取到数据的话就会报错。 所以,数值必须大于等于0。

weight.databias.data

正如我们在构造nn.Linear时指定输入和输出尺寸一样, 现在我们能直接访问参数以设定它们的初始值。 我们通过net[0]选择网络中的第一个图层, 然后使用weight.databias.data方法访问参数。 我们还可以使用替换方法normal_fill_来重写参数值。

MSELoss

计算均方误差的函数,也称为L2范数

在每个迭代周期里,我们将完整遍历一次数据集(train_data), 不停地从中获取一个小批量的输入和相应的标签。 对于每一个小批量,我们会进行以下步骤:

  • 通过调用net(X)生成预测并计算损失l(前向传播)。
  • 通过进行反向传播来计算梯度。
  • 通过调用优化器来更新模型参数。

softmax

单层神经网络

函数损失为交叉熵损失

torch.flatten()

torch.flatten()等于torch.flatten(x,0)默认将张量拉成一维的向量,也就是说从第一维开始平坦化,torch.flatten(x,1)代表从第二维开始平坦化。

torch.flatten(input, start_dim=0, end_dim=-1) → Tensor

Parameters:
  • input (Tensor) – 输入为Tensor

  • start_dim (int) – 展平的开始维度

  • end_dim (int) – 展平的最后维度

从start-end之间进行合并

回想一下,softmax函数 y j = e x p ( o j ) ∑ k e x p ( o k ) y_j = \frac{exp(o_j)}{\sum_kexp(o_k)} yj=kexp(ok)exp(oj), 其中 y j y_j yj是预测的概率分布。 o j o_j oj是未规范化的预测o的第j个元素。 如果中的一 o k o_k ok些数值非常大, 那么exp⁡(ok)可能大于数据类型容许的最大数字,即上溢(overflow)。 这将使分母或分子变为inf(无穷大), 最后得到的是0、infnan(不是数字)的 y j y_j yj。 在这些情况下,我们无法得到一个明确定义的交叉熵值。

在继续softmax计算之前,先从所有ok中减去 m a x ( o k ) max(o_k) max(ok)。 你可以看到每个ok按常数进行的移动不会改变softmax的返回值:

y j = e x p ( o j − m a x ( o k ) ) e x p ( m a x ( o k ) ) ∑ k e x p ( o k − m a x ( o k ) ) e x p ( m a x ( o k ) ) y_j = \frac{exp(o_j-max(o_k))exp(max(o_k))}{\sum_kexp(o_k-max(o_k))exp(max(o_k))} yj=kexp(okmax(ok))exp(max(ok))exp(ojmax(ok))exp(max(ok))

用log计算损失 l o g ( y j ) = o j − m a x ( o k ) − log ⁡ ( ∑ k e x p ( o k − m a x ( o k ) ) ) log(y_j)=o_j-max(o_k)-\log(\sum\limits_k exp(o_k-max(o_k))) log(yj)=ojmax(ok)log(kexp(okmax(ok)))

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用numpy实现机器学习线性回归可以分为以下几个步骤: 1. 导入所需的库 ```python import numpy as np ``` 2. 准备数据 我们需要准备好训练数据和标签,这里我们使用一个简单的例子,假设我们想要预测一个人的体重(weight)与身高(height)之间的关系。 ```python # 身高数据 X = np.array([156, 157, 158, 159, 160, 161, 162, 163, 164, 165]).reshape((-1, 1)) # 体重数据 y = np.array([52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) ``` 3. 添加偏置项 在线性回归中,我们需要添加一个偏置项,也就是常数项,这里我们使用numpy中的`ones`函数来实现。 ```python # 添加偏置项 X = np.concatenate((np.ones((X.shape[0], 1)), X), axis=1) ``` 4. 初始化参数 在线性回归中,我们需要初始化参数,也就是权重(weight),这里我们初始化为一个随机向量。 ```python # 初始化权重 theta = np.random.rand(X.shape[1]) ``` 5. 定义损失函数 在线性回归中,我们使用均方误差(MSE)作为损失函数,定义如下: ```python def mse_loss(X, y, theta): m = X.shape[0] y_pred = X.dot(theta) loss = np.sum((y_pred - y) ** 2) / (2 * m) return loss ``` 6. 定义梯度下降函数 在线性回归中,我们使用梯度下降来更新参数,定义如下: ```python def gradient_descent(X, y, theta, learning_rate, num_iterations): m = X.shape[0] for i in range(num_iterations): y_pred = X.dot(theta) theta -= (learning_rate / m) * (X.T.dot(y_pred - y)) loss = mse_loss(X, y, theta) print(f"Iteration {i+1}: loss={loss}, theta={theta}") return theta ``` 7. 训练模型 使用上述定义的损失函数和梯度下降函数,我们可以训练模型,得到最优的权重。 ```python # 训练模型 theta = gradient_descent(X, y, theta, learning_rate=0.01, num_iterations=100) ``` 8. 预测结果 使用训练好的模型,我们可以对新的数据进行预测。 ```python # 预测结果 X_test = np.array([166, 167, 168, 169, 170]).reshape((-1, 1)) X_test = np.concatenate((np.ones((X_test.shape[0], 1)), X_test), axis=1) y_pred = X_test.dot(theta) print(y_pred) ``` 以上就是使用numpy实现机器学习线性回归的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值