案例:使用pytorch实现一元线性回归模型

10 Python/DL/ML 专栏收录该内容
242 篇文章 3 订阅

                                                                                      点击此处返回总目录

 

一、什么是线性回归

线性回归是分析一个变量与另一个变量的关系的方法。

线性回归的意思就是指x与y之间的关系是线性的。y = wx+b

 

二、求解的步骤

1. 确定模型。                 这里选择y = wx+b

2. 选择损失函数。          这里采用均方差误差。

3. 求梯度并更新w和b。  w = w - l * w.grad         b = b - l * b.grad

 

三、如果不使用pytorch,如何实现线性回归

'''
python实现一元线性回归:y = wx + b
使用的是批量梯度下降算法(所有样本算一次梯度)
'''

import numpy as np
import matplotlib.pyplot as plt

learning_rate = 0.01  #学习率

#创建训练数据
#np.random.seed(123)
x_train = np.random.rand(20) * 10                #x_train是一个一维数组。np.random.rand(n)产生n个均匀分布的样本值,范围是[0,1)。x_train.shape为(10,)
y_train = 2* x_train + 5 + np.random.randn(20)   #y_train是一个一维数组。np.random.rand(n)产生n个服从标准正态分布的数据。

#构建参数
w = 1.0
b = 1.0

#前向传播
def forward(x):
    return w * x + b

#计算MSE loss
def loss(y, y_pred):
    return (y_pred - y) ** 2

#反向传播,计算梯度
def gradient(x, y):
    w_grad = 2 * x * (w * x + b - y)
    b_grad = 2 * (w * x + b - y)
    return w_grad, b_grad


for epoch in range(3000):             #共迭代3000轮
    i = 0
    Loss = 0
    w_gradient = 0
    b_gradient = 0
    while i < x_train.shape[0]:                     #x_train.shape为(10,)。每一次取一个元素。
        y_pre = forward(x_train[i])                #前向传播
        Loss += loss(y_train[i], y_pre)            #计算每个样本的损失,加到总的损失上
        w_gra, b_gra = gradient(x_train[i], y_train[i])    #反向传播,计算每个样本的梯度
        w_gradient += w_gra
        b_gradient += b_gra
        i +=1

    Loss /= x_train.shape[0]                        #计算平均损失
    w = w - learning_rate * w_gradient/x_train.shape[0]  # 更新权重w
    b = b - learning_rate * b_gradient/x_train.shape[0]  # 更新权重b


    if epoch%20 == 0:
        plt.scatter(x_train, y_train, color='black')
        plt.plot(x_train, forward(x_train), 'r-', lw=0.2)
        plt.title('epoch=%d, Loss=%.4f, w=%.4f, b=%.4f' % (epoch,Loss,w,b))
        plt.pause(0.1)

print("w={}, b={}".format(w,b))

运行效果:

 

四、如果使用pytorch,如何实现一元线性回归

'''
pytorch实现一元线性回归:y = wx + b
还不是pytorch的一般使用流程
'''

import torch
import matplotlib.pyplot as plt


lr = 0.01       #学习率

#创建数据集
x = torch.rand((20,1)) *10
y = 2*x + 5 + torch.randn((20,1))

#参数w和b
w = torch.tensor([1.0], requires_grad=True)
b = torch.tensor([1.0], requires_grad=True)

for epoch in range(3000):
    #前向传播
    wx = torch.mul(w, x)      #按位乘。广播机制,w先变成向量,然后对应乘。
    y_pre = torch.add(wx, b)  #按位加。

    #计算MSE损失
    loss = ((y_pre - y)**2).mean()   #MSE loss

    #反向传播。计算梯度
    loss.backward()

    #更新参数
    b.data.sub_(lr * b.grad)      # b = b - lr * b.grad
    w.data.sub_(lr * w.grad)      # w = w - lr * w.grad

    #清零张量的梯度
    b.grad.zero_()
    w.grad.zero_()

    if epoch%20 == 0:
        plt.scatter(x.data.numpy(),y.data.numpy(),color='blue')
        plt.plot(x.data.numpy(), y_pre.data.numpy())
        plt.title("epoch:{}, loss:{}, w:{}, b:{}".format(epoch,loss.data.numpy(), w.data.numpy(),b.data.numpy()))
        plt.pause(0.5)

        if loss.data.numpy() < 1:
            break
   

 

在这个案例中,我们虽然使用了 pytorch,但是很多方法都是我们自己实现的,比如损失函数、求梯度等等。

后面会学习,如何使用pytorch提供的函数实现。

 

 

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值