首页 > 编程语言 >Pytorch 实现简单的 线性回归 算法

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

时间:2024-06-11 15:00:34浏览次数:11  
标签:plt grad data torch 算法 Variable Pytorch 线性 numpy

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

简单 tensor的运算

Pytorch涉及的基本数据类型是tensor(张量)和Autograd(自动微分变量)

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

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做一个简单的线性关系预测

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


x = Variable(torch.linspace(0, 100, 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() 

在这里插入图片描述

构建模型

#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条件下的模型预测数值
    # 在 PyTorch 中,a.expand_as(x) 用于将张量 a 扩展(expand)为与张量 x 具有相同的形状
    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()                       # 将tensor 转为 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(['Obs', 'Model']) #绘制图例
plt.show()

在这里插入图片描述

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  #输出预测的数值

标签:plt,grad,data,torch,算法,Variable,Pytorch,线性,numpy
From: https://blog.csdn.net/weixin_45492560/article/details/139586053

相关文章

  • 代码随想录算法训练营第9天 |
    28.strStr()https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/实现strStr()代码随想录https://programmercarl.com/0028.实现strStr.html#思路459.重复字符串https://leetcode.cn/problems/repeated-substring-pattern/submis......
  • Dijkstra 算法的手动分析
    目录Dijkstra算法step0.初始状态step1.第一轮step2.第二轮step3.第三轮step4.第四轮Dijkstra算法以下面有向图为例:graphLRV0((V0))--10-->V1((V1))V0((V0))--5-->V4((V4))V1((V1))--2-->V4((V4))V4((V4))--3-->V1((V1))V1((V1))--1-->V2((V2)......
  • RSA算法中,为什么需要的是两个素数?
    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。RSA算法中,为什么需要的是两个素数?RSA算法是一种广泛使用的非对称加密技术,基于大数分解的困难性。本文将探讨为什么RSA算法需要两个素数,并以通......
  • 数据结构---排序算法
    个人介绍hellohello~,这里是code袁~......
  • 代码随想录算法训练营第七天 |
    454.四数相加题目:给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0解题:思路:使用map,key为a+b,value为出现次数。再遍历k、l寻找0-a-b。关键:遍历......
  • 【算法与数据结构】【数组篇】【题1-题5】
    1.数组基本知识点1.1概念数组就是一个集合。数组会用一些名为索引的数字来标识每项数据在数组中的位置,且在大多数编程语言中,索引是从0算起的。我们可以根据数组中的索引,快速访问数组中的元素。数组中的元素在内存中是连续存储的,且每个元素占用相同大小的内存。1.2相关操......
  • “深度学习之巅:在 CentOS 7 上打造完美Python 3.10 与 PyTorch 2.3.0 环境”学习
    在CentOS7上安装Python3.10和PyTorch2.3.0时,为什么要首先升级OpenSSL?在CentOS7上,默认安装的OpenSSL版本可能不支持Python3.10所需的最新加密标准。因此,为了确保Python3.10能够正常工作,需要先升级OpenSSL到支持这些标准的版本。升级OpenSSL的具体步骤是什么?升级Ope......
  • 笔记本电脑(win11+3060+conda)安装PyTorch踩坑记录
    简而言之,先看你的显卡,打开CMD,输入nvidia-smi,右上角有一个CUDA:XX.X表示当前显卡及当前驱动支持的最高版本CUDA。输入nvidia-smi-q可以看到显卡架构(或者直接去Nvidia官网找你的显卡)。再打开这个连接,查看你显卡架构支持的最低版本CUDA。从中选择一个cuda版本torch是自带了cu......
  • 线性规划对偶学习笔记
    对于一个线性规划问题,若其有最优解,那么其对偶问题也有最优解,且最优值相等。如果对于一个困难的线性规划问题,其对偶形式比较简单,此时就可以通过线性规划对偶,解决其对偶问题,从而解决原问题。线性规划的原问题与对偶问题的变化规则:对于一个标准型线性规划:\[\max\quadC^Tx\\s.t......
  • LeetCode 算法:缺失的第一个正数c++
    原题链接......