线性回归

线性回归

数学模型

y = w 1 ∗ x 1 + w 2 ∗ x 2 + . . . + w n ∗ x n + b y = w_1*x_1 + w_2*x_2 + ... +w_n*x_n+b y=w1x1+w2x2+...+wnxn+b

W ⃗ = [ w 1 , w 2 , . . . , w n ] \vec{W} = [w_1,w_2,...,w_n] W =[w1,w2,...,wn]

X ⃗ = [ x 1 , x 2 , . . . , x n ] \vec{X} = [x_1,x_2,...,x_n] X =[x1,x2,...,xn]

y = W ∗ X T + b y = W * X^T + b y=WXT+b

术语

样 本: X ⃗ \vec{X} X

标 签: y y y

特 征: W ⃗ \vec{W} W

数据集: D a t a S e t s ⃗ = [ X 1 , X 2 , X 3 , . . . , X m ] \vec{DataSets} = [X_1, X_2, X_3, ..., X_m] DataSets =[X1,X2,X3,...,Xm]

##传统求解

在没有深度学习之前,

l e n ( D a t a S e t s ) < l e n ( W ⃗ ) len(DataSets) < len(\vec{W}) len(DataSets)<len(W )时是无解的,

l e n ( D a t a S e t s ) > l e n ( W ⃗ ) len(DataSets) > len(\vec{W}) len(DataSets)>len(W )时:一般使用最小二乘法求解,

损失函数(评价)

在传统方法里面,使用 M S E MSE MSE作为评价标准

l i ( W ⃗ , b ) = 1 2 ( y ^ i − y i ) 2 l^i(\vec{W}, b) = \frac{1}{2}(\hat{y}^i - y^i)^2 li(W ,b)=21(y^iyi)2

L ( W ⃗ , b ) = 1 n ∑ i = 1 m l i ( W ⃗ , b ) = 1 n ∑ i = 1 m 1 2 ( y ^ i − y i ) 2 L({\vec{W}, b}) = \frac{1}{n}\displaystyle\sum^{m}_{i=1}{l^i(\vec{W}, b)} = \frac{1}{n}\displaystyle\sum^{m}_{i=1}{\frac{1}{2}(\hat{y}^i - y^i)^2} L(W ,b)=n1i=1mli(W ,b)=n1i=1m21(y^iyi)2

优化函数-随机梯度下降

小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch) β \beta β,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。

( W ⃗ , b ) ← ( W ⃗ , b ) − η β ∑ i ∈ β ∂ ( W ⃗ , b ) l i ( W ⃗ , b ) (\vec{W}, b) \leftarrow (\vec{W}, b) - \frac{\eta}{\beta}\displaystyle\sum_{i\in\beta}{\partial_(\vec{W}, b)l^i(\vec{W}, b)} (W ,b)(W ,b)βηiβ(W ,b)li(W ,b)

学 习 率 ( η ) (\eta) (η):代表在每次优化中,能够学习的步长的大小

批量大小 ( β ) (\beta) (β):是小批量计算中的批量大小batch size

####优化函数步骤:

1、初始化模型参数,一般来说使用随机初始化;

2、我们在数据上迭代多次,通过在负梯度方向移动参数来更新每个参数。

# 使用pytorch实现线性回归模型
import torch
from torch import nn
import numpy as np
torch.manual_seed(1)

print(torch.__version__)
torch.set_default_tensor_type('torch.FloatTensor')

# 设置输入特征数
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)
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)

# 显示生成的数据
plt.scatter(features[:, 1].numpy(), labels.numpy(), 1)

# 读取数据集
import torch.utils.data as Data

batch_size = 10

# 结合数据集的特性和标签
dataset = Data.TensorDataset(features, labels)
# 将数据集放入DataLoader
data_iter = Data.DataLoader(dataset=dataset,        # torch张量数据集格式
                            batch_size=batch_size,  # 小批量大小
                            shuffle=True,           # 是否打乱数据
                            num_workers=2)          # 线程数
for X, y in data_iter:
    print(X, '\n', y)
    break

# 定义模型
class LinearNet(nn.Module):
    def __init__(self, n_feature):
        super(LinearNet, self).__init__()  # 调用父函数初始化
        # 函数原型: `torch.nn.Linear(in_features, out_features, bias=True)`
        self.linear = nn.Linear(n_feature, 1)
        
    def forward(self, x):
        y = self.linear(x)
        return y

net = LinearNet(num_inputs)
print(net)

# 初始化多层网络的方法
# 方法一
net = nn.Sequential(
    nn.Linear(num_inputs, 1)
    # 可以在内部添加其他层
)

# 方法二
net = nn.Sequential()
net.add_module('linear', nn.Linear(num_inputs, 1))
# 可以继续添加其他层

# 方法三
from collections import OrderedDict
net = nn.Sequential(OrderedDict([
          ('linear', nn.Linear(num_inputs, 1))
          # ......
        ]))

print(net)
print(net[0])

# 初始化模型参数
from torch.nn import init

init.normal_(net[0].weight, mean=0.0, std=0.01)
init.constant_(
    net[0].bias, val=0.0
)  
#  或者您可以使用' net[0].bias.data.fill_(0) '直接修改它

for param in net.parameters():
    print(param)
    
# 定义损失函数
loss = nn.MSELoss()
'''
nn内置平方损失函数
功能原型:“torch.nn.MSELoss(size_average=None, 
                            reduce=None, 
                            reduction='mean')”)”
'''
# 定义优化函数
import torch.optim as optim

optimizer = optim.SGD(net.parameters(), lr=0.03)
'''
内置随机梯度下降功能
函数原型: torch.optim.SGD(params, 
                          lr=, 
                          momentum=0, 
                          dampening=0, 
                          weight_decay=0, 
                          nesterov=False)
'''
print(optimizer)  

# 训练
num_epochs = 5
for epoch in range(1, num_epochs + 1):
    for X, y in data_iter:
        output = net(X)
        l = loss(output, y.view(-1, 1))
        optimizer.zero_grad() # reset gradient == net.zero_grad()
        l.backward()
        optimizer.step()
    print('epoch %d, loss: %f' % (epoch, l.item()))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值