线性回归的原理(案例代码+详细注释)

一、线性回归的从零开始(摆脱封装好的算法)

        尽管现在已经有很多的深度学习框架已经封装好了线性回归这一算法,让我们可以随时调用,简单且方便,但是这会导致很多人难以理解这一算法是如何工作的,怎么一步一步实现线性回归算法的。因此本文以pytorch框架为基础,仅使用Tensorautograd来实现一个线性回归。

二、代码示例讲解

0.导入相关包

%matplotlib inline
import torch
from IPython import display
from matplotlib import pyplot as plt
import numpy as np
import random

1.手写数据集

构造训练数据集,本文的数据集样本为1000,输入个数(特征值)为2,使用线性回归真实权重w=[2,-3.4] ^{T}和偏差b=4.2,样本特征则为1000 x 2 的张量,以及一个随机噪声项 ϵ,最终标签公式为:

y=Xw+b+\epsilon

其中噪声项 ϵ 服从均值为0、标准差为0.01的正态分布。噪声代表了数据集中无意义的干扰。

num_inputs = 2 #样本特征值个数
num_examples = 1000 #样本个数
true_w = [2, -3.4]  #权重值  
true_b = 4.2        #偏差因子
features = torch.randn(num_examples, num_inputs,
                       dtype=torch.float32)        #随机生成数据类型为float的1000 x 2的矩阵
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b  #目标值(预测值)
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()),
                       dtype=torch.float32)    #每个标签(目标值)随机添加均值为0,标准差为0.01,满足正态分布的噪声项

#打印特征值和标签值的形状,以及他们各自第一行的信息
print('features:',features.shape,'|labels:',labels.shape)
print(features[0], labels[0])

输出结果:features的每一行是一个长度为2的向量,而labels的每一行是一个长度为1的向量(标量)。

 2.查看数据的散点图

plt.figure(figsize=(4,3)) #设置画布大小
plt.scatter(features[:,1].numpy(),labels.numpy(),1) #绘制散点图,点大小为1,因为features是tensor类型,需转成numpy
plt.show()

 输出的散点图:

3.读取数据

def data_iter(batch_size, features, labels): #这里设置了批量大小,即在读取数据中,按批量大小不断读取数据样本,目的是提高训练速度
    num_examples = len(features)    #读取样本行数
    indices = list(range(num_examples)) #生成序号列表
    random.shuffle(indices)  # 样本的读取顺序是随机的
    for i in range(0, num_examples, batch_size):
        j = torch.LongTensor(indices[i: min(i + batch_size, num_examples)]) # 最后一次可能不足一个batch
        yield  features.index_select(0, j), labels.index_select(0, j)

4.初始化模型参数

w = torch.tensor(np.random.normal(0, 0.01, (num_inputs, 1)), dtype=torch.float32) #将权重初始化为均值为0,标准差为0.01的正态随机数
b = torch.zeros(1, dtype=torch.float32) #将偏差因子初始化为0

#因在训练过程中需要对这些参数进行求梯度来迭代更新,因此需要设置requires_grad=True
w.requires_grad_(requires_grad=True)
b.requires_grad_(requires_grad=True) 

5.定义模型

def linreg(X, w, b):  
    return torch.mm(X, w) + b #mm函数是torch包的乘法函数

相当于返回了一个公式:y=Xw+b

6.定义损失函数

def squared_loss(y_hat, y): 
    # 注意这里返回的是向量, 另外, pytorch里的MSELoss并没有除以 2
    return (y_hat - y.view(y_hat.size())) ** 2 / 2 #y_hat是预测值,同时也要将真实值y的形状保持和预测值一样

7.定义优化算法 

以下的sgd函数实现了小批量随机梯度下降算法。它通过不断迭代模型参数来优化损失函数。这里自动求梯度模块计算得来的梯度是一个批量样本的梯度和。我们将它除以批量大小来得到平均值。

def sgd(params, lr, batch_size):  #lr为学习率,params为线性回归模型的参数(weight和bias)
    for param in params:
        param.data -= lr * param.grad / batch_size # 注意这里更改param时用的param.data

8.训练模型

在训练中,我们将多次迭代模型参数。在每次迭代中,我们根据当前读取的小批量数据样本(特征X和标签y,通过调用反向函数backward计算小批量随机梯度,并调用优化算法sgd迭代模型参数。由于我们之前设批量大小batch_size为10,每个小批量的损失l的形状为(10, 1)。。由于变量l并不是一个标量,所以我们可以调用.sum()将其求和得到一个标量,再运行l.backward()得到该变量有关模型参数的梯度。注意在每次更新完参数后不要忘了将参数的梯度清零。

lr = 0.03
num_epochs = 3
net = linreg #调用线性回归函数
loss = squared_loss #调用损失函数
batch_size = 10 #批量大小

for epoch in range(num_epochs):  # 训练模型一共需要num_epochs个迭代周期
    # 在每一个迭代周期中,会使用训练数据集中所有样本一次(假设样本数能够被批量大小整除)。
    # X和y分别是小批量样本的特征和标签
    for X, y in data_iter(batch_size, features, labels):
        l = loss(net(X, w, b), y).sum()  # l是有关小批量X和y的损失
        l.backward()  # 小批量的损失对模型参数求梯度
        sgd([w, b], lr, batch_size)  # 使用小批量随机梯度下降迭代模型参数

        # 梯度清零
        w.grad.data.zero_()
        b.grad.data.zero_()
    train_l = loss(net(features, w, b), labels)
    print('epoch %d, loss %f' % (epoch + 1, train_l.mean().item())) #mean()为均值函数


#输出
'''
epoch 1, loss 0.028127
epoch 2, loss 0.000095
epoch 3, loss 0.000050

'''

训练完成后还可以查看真实值与预测值的参数值

print(true_w, '\n', w)
print(true_b, '\n', b)

#输出
'''
[2, -3.4] 
 tensor([[ 1.9998],
        [-3.3998]], requires_grad=True)
4.2 
 tensor([4.2001], requires_grad=True)

'''

全部代码(自取 ):https://github.com/SallBryant/Nerual-Net-Simple-example/blob/main/Linear-zero_to_one.ipynb

分享自己所学的知识,向开源分享的人学习,他们是榜样,为大家学习知识降低了门槛。花时间来创作博客的动力来源于莫凡大佬的传教! 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多元线性回归模型是一种用来描述因变量与多个自变量之间关系的统计模型。在Matlab中,我们可以使用`fitlm`函数来构建并拟合多元线性回归模型。 首先,我们需要准备好数据集。假设我们有一个包含n个样本、p个自变量和一个因变量的数据集,可以用一个n×(p+1)的矩阵X来表示自变量,其中包含p列自变量和一列常数1,用来表示截距。因变量则用一个n×1的列向量Y表示。 接下来,我们可以使用`fitlm`函数来构建多元线性回归模型。函数的语法如下: ```matlab mdl = fitlm(X, Y) ``` 其中,`X`是自变量的矩阵,`Y`是因变量的列向量,`mdl`是拟合后的多元线性回归模型对象。 我们还可以使用其他可选参数来控制拟合过程,例如指定拟合模型的形式、使用的误差分布等。 一旦模型拟合完成,我们可以使用模型对象的各种方法和属性来分析和解释结果。例如,可以使用`coefficients`属性来获取模型的回归系数,使用`predicted`方法来预测新的因变量的值。 以下是一个示例代码案例: ```matlab % 准备数据集 X = [ones(n, 1), X]; % 加一列常数1 Y = Y; % 构建多元线性回归模型 mdl = fitlm(X, Y); % 获取回归系数 coeffs = mdl.Coefficients; % 预测新的因变量值 newX = [1, x1, x2, x3]; % 假设有新的自变量值 x1, x2, x3 predictedY = predict(mdl, newX); ``` 这只是一个简单的示例,实际使用时,我们可能还需要进行数据预处理、模型评估和结果解释等。希望这个简单的示例能帮助您理解多元线性回归模型在Matlab中的实现过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值