线性回归基本理论

名词汇总

名词 说明 举例(写法)
training data set
sample(data point, data instance数据样本) $\bold{x}^{(i)}=[x_1^{(i)}+x_2^{(i)}]^T$
label(target) 试图预测的目标 $y^{(i)}$
features(covariates协变量) 预测时依据的自变量
batch size 小批量样本数
learning rate
hyperparameter 超参数
hyperparameter tuning 调参
validation data set 验证数据集
likelihood 可能性

线性回归基本概念

基本要素

  • x和y之间呈线性关系
  • 噪声正态分布

表达式

例如$y=w_1x_1+w_2x_2+b$,可称之为仿射变换(affine transformation)

通过加权和特征进行线性变换,并通过偏置项进行平移

写成向量形式

记X为特征集合,每行代表一个样本,每列代表一个特征,线性模型为

目标

给定训练数据特征X、已知标签y,求权重向量w和偏置b,当给定从X同分布中取样的新样本特征时,使得新样本预测标签的误差尽可能小。

损失函数

平方误差

常用平方误差:

系数1/2是为了求导之后系数变为1,无特殊含义

一般计算训练集n个样本上的损失均值

与正态分布的联系

正态分布随机变量x具有均值$\mu$和标准差$\sigma$,概率密度函数为

Snipaste_2022-10-13_21-26-37

总结:最小化目标函数等价于执行最大似然估计

解析解

线性回归问题可以表示为

存在解析解【但是还不会算】

Minibatch stochastic gradient descent(小批量随机梯度下降)

梯度下降:计算损失函数关于模型参数导数(梯度)

每次计算更新时随机抽取一小批样本$\Beta$:Minibatch stochastic gradient descent

算法步骤

  • 初始化模型参数
  • 随机抽取小批量样本,在负梯度方向更新参数
  • 不断迭代

参数说明

  • $|\Beta|$表示每个小批量的样本数(batch size)
  • $\eta$表示学习率(learning rate)

这些参数通常预先指定,可以调整,但不在训练过程中更新,称为超参数(hyperparameter),选择超参数的过程称为调参(hyperparameter tuning)

矢量化加速

利用线性代数库矢量化代码,可以实现对运算数量级的速度提升。

与神经网络的联系

线性回归模型可视为单个人工神经元组成的网络(单层神经网络)

Snipaste_2022-10-13_21-31-37

调用API版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import torch
from torch.utils import data
from torch import nn


def synthesis_data(w, b, number):
X = torch.rand(number, len(w))
noise = torch.normal(0, 0.01, size=(number, 1))
y = torch.matmul(X, w) + noise
y += b
return X, y

# dataloader 还不理解
def load_array(data_array, batch_size, is_train=True):
dataset = data.TensorDataset(*data_array)
return data.DataLoader(dataset, batch_size, shuffle=is_train)




if __name__ == '__main__':
# 生成数据集
w_true = torch.tensor([2, -3.4]).reshape(2, 1)
b_true = 4.2
n = 1000
features, labels = synthesis_data(w_true, b_true, n)

batch_size = 10
data_iter = load_array((features, labels), batch_size)
# print(next(iter(data_iter)))

net = nn.Sequential(nn.Linear(2, 1))
net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
# print(net[0])

loss = nn.MSELoss()
trainer = torch.optim.SGD(net.parameters(), lr=0.03)

num_epochs = 30
for epoch in range(1, num_epochs+1):
for X, y in data_iter:
l = loss(net(X), y)
trainer.zero_grad()
l.backward()
trainer.step()
l = loss(net(features), labels)
print(f'epoch{epoch}, loss{l:.4f}')

w = net[0].weight.data
b = net[0].bias.data
print(f'error of w= {w-w_true}')
print(f'error of b= {b-b_true}')

其中还有不少不理解的地方,等待后续补充

【不理解的地方】


线性回归基本理论
http://example.com/2022/12/17/线性回归基本理论/
作者
Thunderbolt
发布于
2022年12月17日
许可协议