栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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


#导入库
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=)

 定义好了误差函数,接下来我们需要计算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次之后,我们发现红色的预测结果已经比较好的拟合了蓝色的真实值 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004877.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号