【机器学习】线性回归PyTorch实现

本文通过实例演示了如何使用PyTorch实现线性回归模型。从数据准备到模型训练全过程,展示了损失函数计算、梯度下降等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有关线性回归的知识点之前讲过,想要再巩固和学习一下的小伙伴可以看这一篇:

【机器学习】线性回归(超详细)_无咎.lsy的博客-优快云博客_机器学习 线性回归


#导入库
import torch
import numpy as np
from torch.autograd import Variable
#设置CPU生成随机数的种子,方便下次复现实验的结果
torch.manual_seed(2017)

初始化数据

#输入数据
x_train=np.array([[3.3],[4.4],[5.5],[6.71],[6.93],[4.168],
                 [9.779],[6.182],[7.59],[2.167],[7.042],
                 [10.791],[5.313],[7.997],[3.1]],dtype=np.float32)
y_train=np.array([[1.7],[2.76],[2.09],[3.19],[1.694],[1.573],
                 [3.366],[2.596],[2.53],[1.221],[2.827],
                 [3.465],[1.65],[2.904],[1.3]],dtype=np.float32)
#画出图像
import matplotlib.pyplot as plt
%matplotlib inline

plt.plot(x_train,y_train,'bo')#b为蓝色,o为圆点

 

 

#转换成tensor
x_train=torch.from_numpy(x_train)
y_train=torch.from_numpy(y_train)

#定义参数w和b
w=Variable(torch.randn(1),requires_grad=True) #随机初始化
b=Variable(torch.zeros(1),requires_grad=True)#使用0 进行初始化
#构建线性回归模型
x_train=Variable(x_train)
y_train=Variable(y_train)

def linear_model(x):
    return x*w+b
y_=linear_model(x_train)

 经过上面的步骤我们就定义好了模型,在进行参数更新之前,我们可以先看看 模型的输出结果长什么样

plt.plot(x_train.data.numpy(),y_train.data.numpy(),'bo',label="real")
plt.plot(x_train.data.numpy(),y_.data.numpy(),'ro',label='estimated')#r 红色,o:标记字符
plt.legend()#显示图例的位置,自适应方式

 

 

#计算误差
def get_loss(y_,y):
    return torch.mean(y_-y_train)**2
loss=get_loss(y_,y_train)
#打印一下看看loss的大小
print(loss)
tensor(130.7933, grad_fn=<PowBackward0>)

 定义好了误差函数,接下来我们需要计算w和b的梯度了,这时得益于pytorch的自动求导,我们不需要动手去算梯度

#自动求导
loss.backward()
#查看w和b的梯度
print(w.grad)
print(b.grad)

 tensor([138.7155])

tensor([22.8730])

#更新一次参数
w.data=w.data-1e-2 * w.grad.data
b.data=b.data-1e-2 * b.grad.data

 更新完成参数后,我们再一次看看模型输出的结果

y_=linear_model(x_train)
plt.plot(x_train.data.numpy(),y_train.data.numpy(),'bo',label='real')
plt.plot(x_train.data.numpy(),y_.data.numpy(),'ro',label='estimated')
plt.legend()

 

 从上面的例子可以看到,更新之后红色的线跑到了蓝色的线下面,没有特别好的拟合蓝色的真实值,所以我们需要在进行几次更新

for e in range(10): #进行10次更新
    y_=linear_model(x_train)
    loss=get_loss(y_,y_train)
    
    w.grad.zero_() #记得归零梯度
    b.grad.zero_() #记得归零梯度
    loss.backward()
    
    w.data=w.data-1e-2 *w.grad.data #更新 w
    b.data=b.data-1e-2 *b.grad.data #更新 b
    print('epoch:{}, loss:{}'.format(e,loss.data))

 输出:

epoch:0, loss:0.46674472093582153
epoch:1, loss:0.02788214012980461
epoch:2, loss:0.0016656038351356983
epoch:3, loss:9.950181993190199e-05
epoch:4, loss:5.944333224761067e-06
epoch:5, loss:3.5499670048011467e-07
epoch:6, loss:2.1209265455013337e-08
epoch:7, loss:1.2619807421287987e-09
epoch:8, loss:7.326036999266705e-11
epoch:9, loss:4.5025667222420296e-12
y_=linear_model(x_train)
plt.plot(x_train.data.numpy(),y_train.data.numpy(),'bo',label='real')
plt.plot(x_train.data.numpy(),y_.data.numpy(),'ro',label='estimated')
plt.legend()

 

 更新10次之后,我们发现红色的预测结果已经比较好的拟合了蓝色的真实值 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

23#.lsy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值