首页 > 其他分享 >PyTorch之线性回归模型

PyTorch之线性回归模型

时间:2023-10-15 19:56:25浏览次数:27  
标签:plt 模型 torch 标准化 prices PyTorch 线性 self areas

1 简介

1.1 线性回归模型简介

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = wx+e,e为误差服从均值为0的正态分布。其中只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,称为一元线性回归。

1.2 Tensor

PyTorch 是一个开源的 Python 机器学习库,基于 Torch。其中Tensor是深度学习中最为基础也最为关键的数据结构:

  • Tensor之于PyTorch就好比是array之于Numpy或者DataFrame之于Pandas,都是构建了整个框架中最为底层的数据结构;
  • Tensor与普通的数据结构不同,具有一个极为关键的特性——自动求导。

其中Numpy很容易转化成Tensor,参考方式:

import numpy as np
import torch
a = np.random.normal(0, 1, (2, 3))

# 使用torch.tensor
b = torch.tensor(a)
# 使用torch.from_numpy
b = torch.from_numpy(a)

2. 数据准备

2.1 数据集概述

在这个示例中,我们将使用一个虚构的数据集,该数据集包含房屋面积和价格的信息。我们的目标是通过面积来预测房价,这是一个典型的线性回归问题。

import torch
import torch.nn as nn

# 房屋面积,设置为浮点型
areas = torch.arange(20.0, 40.0)

# 房价
prices = torch.tensor([5*areas[i]+random.randint(-5,5) for i in range(len(areas))])

2.2 数据直观分析

Matplotlib 是 Python 生态系统的一个重要组成部分,是用于可视化的绘图库。拿到数据先绘图看下分布情况,参考代码如下:

import matplotlib.pyplot as plt
plt.xlabel("areas")
plt.ylabel("prices")
plt.scatter(areas,prices)
plt.show()

image
初步判定虚拟数据集符合此次实验要求

3 PyTorth实现线性回归

3.1 认识Linear

nn.Linear 是 PyTorch 中用于创建线性层的类,官方定义如下:

class torch.nn.Linear(in_features, out_features, bias=True)

对输入数据做线性变换:y=Ax+b

变量:

  • weight -形状为(out_features x in_features)的模块中可学习的权值
  • bias -形状为(out_features)的模块中可学习的偏置

3.2 构建模型

class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        # 输入和输出的维度都是1
        self.linear = nn.Linear(1, 1)  

    def forward(self, x):
        return self.linear(x)

3.3 选择损失函数和优化器

我们使用均方误差作为损失函数,使用随机梯度下降作为优化器。

model = LinearRegressionModel()
# 选择损失函数
criterion = nn.MSELoss()
# 选择优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

3.4 数据标准化/规范化

在PyTorch中,通过对输入数据进行标准化处理,可以使输入数据的分布更加均匀,减少模型训练过程中的不稳定性,提高模型的泛化能力。常见的方法有:

  1. 最大值标准化
  2. 绝对最大值标准化
  3. 最大最小值标准化
  4. 均值方差标准化
  5. 范数标准化
  6. 四分位法标准化

这个场景我们选择均值方差标准化,对数据进行标准化处理:

class DataNormal:
    def __init__(self, arr):
        self.arr = arr
        self.mean = torch.mean(self.arr)
        self.std = torch.std(self.arr)

    def encode(self, v):
        return (v - self.mean) / self.std

    def decode(self, v):
        return v * self.std + self.mean

# 初始化标准化类,后续预测也会用到
dn_areas = DataNormal(areas)
dn_prices = DataNormal(prices)

# 输入数据标准化
x = dn_areas.encode(areas)
y = dn_prices.encode(prices)

3.5 模型训练

# 转换为二维张量
inputs = x.view(-1,1)
targets = y.view(-1,1)

# 进行 100 轮训练
for epoch in range(100):
    # 前向传播
    outputs = model(inputs)
    loss = criterion(outputs, targets)

    # 反向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    # 效果可视化,非必需
    if epoch % 5  == 0:
        predict = model(inputs)
        plt.plot(x.data.numpy(),predict.squeeze(1).data.numpy(),"r")
        loss = criterion(predict,targets)
        plt.title("Loss:{:.4f}".format(loss.item()))
        plt.xlabel("X")
        plt.ylabel("Y")
        plt.scatter(x,y)
        plt.show()

截取几张图合并展示如下:
image

4. 模型评估与预测

4.1 模型评估

# 将模型设置为评估模式,这样在计算梯度时,不会考虑到dropout和batch normalization等操作
model.eval()
# 不需要计算梯度, 因为我们不需要进行模型优化
with torch.no_grad():
    predictions = model(inputs)
    loss = criterion(predictions, targets)
print("Final Loss:{:.4f}".format(loss.item()))

4.2 数据标准与预测

# 预测一个 100 平方米的房子的价格
area = torch.tensor([100.0])
# 对输入进行标准化
area_sta = dn_areas.encode(area)
price = model(area_sta)
# 对预测值还原,获取真实值
real_price = dn_prices.decode(price)
print(f'Predicted area {area.item()} got price {real_price.item():.4f}')

结果展示如下:

Final Loss:0.0083
Predicted area 100.0 got price 504.4887

训练完毕模型最终预测了一个100平方米的房子价格,并将标准值转化为真实值,成功获取了我们需要的值。

标签:plt,模型,torch,标准化,prices,PyTorch,线性,self,areas
From: https://www.cnblogs.com/maycap/p/17766022.html

相关文章

  • 车辆车型识别系统python+TensorFlow+Django网页界面+算法模型
    一、介绍车辆车型识别系统。本系统使用Python作为主要开发编程语言,通过TensorFlow搭建算法模型网络对收集到的多种车辆车型图片数据集进行训练,最后得到一个识别精度较高的模型文件。并基于该模型搭建Django框架的WEB网页端可视化操作界面。实现用户上传一张车辆车型图片识别其名......
  • python学习——回归模型
    从本篇开始记录一下我在研究生阶段的学习作业之成人死亡率预测(回归模型)1实验介绍1.1实验背景成年人死亡率指的是每一千人中15岁至60岁死亡的概率(数学期望)。这里我们给出了世界卫生组织(WHO)下属的全球卫生观察站(GHO)数据存储库跟踪的所有国家健康状况以及许多其他相关因素。要......
  • 进程的三态模型
        ......
  • 《算法学习专栏》—— DP问题之状态机模型
    2023年10月13日更新于2023年10月13日一、前言本栏,为状态机模型,题目主要来源日常,目前主要来源于Acwing的提高课。希望以后做到状态机的题目,也能加进来,不断完善。使用的分析方法均为闫式DP分析法。字臭。。。希望能用手写板慢慢写的好看。二、状态机模型2.1对于状态机的考虑......
  • VTK 判断一个 点 是否在一个模型 stl 内部 vtk 点是否在内部 表面 寻找最近点
    判断一个点,判断是否在风格stl模型内部,或表面:目录1.方案一:使用vtkCellLocator  FindClosestPoint找到模型上距离给定点最近的一点,计算两点的距离,小于某一阈值则认为此点在模型上;2.方案二使用vtkKdTreePointLocator3.方案三使用vtkSelectEnclosedPoints1.方案一:使用vtk......
  • ABM仿真模型介绍
    从个体动机到群体规律-ABM仿真模型介绍今天我们谈一谈单体/多体仿真模型,模型的英文名称为Agentbasedmodeling,以下简称为ABM模型。像我们熟悉的基于元胞自动机原理、的生命游戏,不同的生命体按照同一规则,在所设置好的环境中进行交互,演变出复杂的形态,这就是一类典型的ABM模型。......
  • 线性表(2)顺序表
    线性表(2)顺序表定义顺序表是一种存储结构,指的是线性表中逻辑相邻的元素在物理内存上也相邻,其用一块连续的地址空间存放表中的数据元素。也就是说,对于表\(A(a_1,a_2,a_3,\dots,a_n)\),设表中元素的大小为\(size\),其物理地址如下:地址Loc(A)Loc(A)+sizeLoc(A)+2size.........
  • 深度学习模型在基因组选择中的预测能力(统计、总结)
    Gianolaetal.[61]:应用:基因组选择。比较:多层感知器(MLP)与贝叶斯线性回归(BRR)。结果:在小麦数据集中,随着隐藏层神经元数量的增加,MLP的预测能力提高。MLP对BRR的性能提高了11.2%至18.6%。在Jersey数据集中,MLP也超越了BRR,特别是在脂肪产量、牛奶产量和蛋白产量上。Pérez-R......
  • 9月大型语言模型研究论文总结
    大型语言模型(llm)在今年发展迅速,随着新一代模型不断地被开发,研究人员和工程师了解最新进展变得非常重要。本文总结9-10月期间发布了一些重要的LLM论文。这些论文涵盖了一系列语言模型的主题,从模型优化和缩放到推理、基准测试和增强性能。最后部分讨论了有关安全训练并确保其行为......
  • [机器学习] 3. 镜像下降 Mirror Descent 与线性耦合 Linear Coupling
    MLTheory太魔怔了!!!!!我们来考虑更快的下降算法。对\(L\)-smooth的GradientDescent,我们有两种视角来看它。一种是局部视角,梯度方向相近的点的函数值一定会下降,另一种是全局视角,用一个二次函数为整个\(f\)提供了一个lowerbound。当局部梯度的范数很大时,函数值会下降的很快;当......