利用Pytorch实现简单的线性回归算法


Posted in Python onJanuary 15, 2020

最近听了张江老师的深度学习课程,用Pytorch实现神经网络预测,之前做Titanic生存率预测的时候稍微了解过Tensorflow,听说Tensorflow能做的Pyorch都可以做,而且更方便快捷,自己尝试了一下代码的逻辑确实比较简单。

Pytorch涉及的基本数据类型是tensor(张量)和Autograd(自动微分变量),对于这些概念我也是一知半解,tensor和向量,矩阵等概念都有交叉的部分,下次有时间好好补一下数学的基础知识,不过现阶段的任务主要是应用,学习掌握思维和方法即可,就不再深究了。tensor和ndarray可以相互转换,python的numpy库中的命令也都基本适用。

一些基本的代码:

import torch #导入torch包
x = torch.rand(5, 3) #产生一个5*3的tensor,在 [0,1) 之间随机取值
y = torch.ones(5, 3) #产生一个5*3的Tensor,元素都是1 
#和numpy的命令一致

#tensor的运算
z = x + y #两个tensor可以直接相加
q = x.mm(y.transpose(0, 1)) #x乘以y的转置 mm为矩阵的乘法,矩阵相乘必须某一个矩阵的行与另一个矩阵的列相等

##Tensor与numpy.ndarray之间的转换
import numpy as np  #导入numpy包
a = np.ones([5, 3])  #建立一个5*3全是1的二维数组(矩阵)
b = torch.from_numpy(a)  #利用from_numpy将其转换为tensor
c = torch.FloatTensor(a) #另外一种转换为tensor的方法,类型为FloatTensor,还可以使LongTensor,整型数据类型
b.numpy() #从一个tensor转化为numpy的多维数组

from torch.autograd import Variable #导入自动梯度的运算包,主要用Variable这个类
x = Variable(torch.ones(2, 2), requires_grad=True)  #创建一个Variable,包裹了一个2*2张量,将需要计算梯度属性置为True

下面用pytorch做一个简单的线性关系预测

线性关系是一种非常简单的变量之间的关系,因变量和自变量在线性关系的情况下,可以使用线性回归算法对一个或多个因变量和自变量间的线性关系进行建模,该模型的系数可以用最小二乘法进行求解。生活中的场景往往会比较复杂,需要考虑多元线性关系和非线性关系,用其他的回归分析方法求解。

这里po上代码:

#人为生成一些样本点作为原始数据
x = Variable(torch.linspace(0, 100).type(torch.FloatTensor)) 
rand = Variable(torch.randn(100)) * 10 #随机生成100个满足标准正态分布的随机数,均值为0,方差为1.将这个数字乘以10,标准方差变为10
y = x + rand #将x和rand相加,得到伪造的标签数据y。所以(x,y)应能近似地落在y=x这条直线上

import matplotlib.pyplot as plt #导入画图的程序包
plt.figure(figsize=(10,8)) #设定绘制窗口大小为10*8 inch
plt.plot(x.data.numpy(), y.data.numpy(), 'o') #绘制数据,考虑到x和y都是Variable,需要用data获取它们包裹的Tensor,并专成numpy
plt.xlabel('X') 
plt.ylabel('Y') 
plt.show()

图示:

利用Pytorch实现简单的线性回归算法

训练模型:

#a,b就是要构建的线性函数的系数
a = Variable(torch.rand(1), requires_grad = True) #创建a变量,并随机赋值初始化
b = Variable(torch.rand(1), requires_grad = True) #创建b变量,并随机赋值初始化
print('Initial parameters:', [a, b])

learning_rate = 0.0001 #设置学习率
for i in range(1000):
  ### 增加了这部分代码,清空存储在变量a,b中的梯度信息,以免在backward的过程中会反复不停地累加
  if (a.grad is not None) and (b.grad is not None): 
    a.grad.data.zero_() 
    b.grad.data.zero_() 
  predictions = a.expand_as(x) * x+ b.expand_as(x) #计算在当前a、b条件下的模型预测数值
  loss = torch.mean((predictions - y) ** 2) #通过与标签数据y比较,计算误差
  print('loss:', loss)

  loss.backward() #对损失函数进行梯度反传,backward的方向传播算法
  a.data.add_(- learning_rate * a.grad.data) #利用上一步计算中得到的a的梯度信息更新a中的data数值
  b.data.add_(- learning_rate * b.grad.data) #利用上一步计算中得到的b的梯度信息更新b中的data数值

##拟合
x_data = x.data.numpy() 
plt.figure(figsize = (10, 7))
xplot = plt.plot(x_data, y.data.numpy(), 'o') # 绘制原始数据
yplot = plt.plot(x_data, a.data.numpy() * x_data + b.data.numpy()) #绘制拟合数据
plt.xlabel('X') 
plt.ylabel('Y') 
str1 = str(a.data.numpy()[0]) + 'x +' + str(b.data.numpy()[0]) #图例信息
plt.legend([xplot, yplot],['Data', str1]) #绘制图例
plt.show()

图示:

利用Pytorch实现简单的线性回归算法

测试:

x_test = Variable(torch.FloatTensor([1, 2, 10, 100, 1000])) #随便选择一些点1,2,……,1000
predictions = a.expand_as(x_test) * x_test + b.expand_as(x_test) #计算模型的预测结果
predictions #输出

ok,大功告成,可以看到用pytorch做机器学习确实无论是准确度还是方便性都有优势,继续探索学习。

以上这篇利用Pytorch实现简单的线性回归算法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python BeautifulSoup设置页面编码的方法
Apr 03 Python
python中sleep函数用法实例分析
Apr 29 Python
使用url_helper简化Python中Django框架的url配置教程
May 30 Python
基于进程内通讯的python聊天室实现方法
Jun 28 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
在python中实现调用可执行文件.exe的3种方法
Jul 07 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
logging level级别介绍
Feb 21 Python
appium+python adb常用命令分享
Mar 06 Python
Python内置函数property()如何使用
Sep 01 Python
python可视化大屏库big_screen示例详解
Nov 23 Python
pytorch实现线性拟合方式
Jan 15 #Python
Python 支持向量机分类器的实现
Jan 15 #Python
pytorch-神经网络拟合曲线实例
Jan 15 #Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 #Python
详解Python3 中的字符串格式化语法
Jan 15 #Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 #Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 #Python
You might like
PHP 编程安全性小结
2010/01/08 PHP
php旋转图片90度的方法
2013/11/07 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
JavaScript 解析Json字符串的性能比较分析代码
2009/12/16 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
jQuery利用sort对DOM元素进行排序操作
2016/11/07 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
python监控文件并且发送告警邮件
2018/06/21 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
python3 map函数和filter函数详解
2019/08/26 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
Python龙贝格法求积分实例
2020/02/29 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
keras 读取多标签图像数据方式
2020/06/12 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
申论倡议书范文
2014/05/13 职场文书
管理提升方案
2014/06/04 职场文书
理发店策划方案
2014/06/05 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
介绍信范文大全
2015/05/07 职场文书