Python反向传播实现线性回归步骤详细讲解

目录
  • 1. 导入包
  • 2. 生成数据
  • 3. 训练数据
  • 4. 绘制图像
  • 5. 代码

1. 导入包

我们这次的任务是随机生成一些离散的点,然后用直线(y = w *x + b )去拟合

首先看一下我们需要导入的包有

torch 包为我们生成张量,可以使用反向传播

matplotlib.pyplot 包帮助我们绘制曲线,实现可视化

2. 生成数据

这里我们通过rand随机生成数据,因为生成的数据在0~1之间,这里我们扩大10倍。

我们设置的batch_size,也就是数据的个数为20个,所以这里会产生维度是(20,1)个训练样本

我们假设大概的回归是 y = 2 * x + 3 的,为了保证损失不一直为0 ,这里我们添加一点噪音

最后返回x作为输入,y作为真实值label

rand [0,1]均匀分布

如果想要每次产生的随机数是一样的,可以在代码的前面设置一下随机数种子

3. 训练数据

首先,我们要建立的模型是线性的y = w * x + b ,所以我们需要先初始化w ,b

使用randn 标准正态分布随机初始化权重w,将偏置b初始化为0

为什么将权重w随机初始化?

  • 首先,为了抑制过拟合,提高模型的泛化能力,我们可以采用权重衰减来抑制权重w的大小。因为权重过大,对应的输入x的特征就越重要,但是如果对应x是噪音的话,那么系统就会陷入过拟合中。所以我们希望得到的模型曲线是一条光滑的,对输入不敏感的曲线,所以w越小越好
  • 那这样为什么不直接把权重初始化为0,或者说很小很小的数字呢。因为,w太小的话,那么在反向传播的时候,由于我们习惯学习率lr 设置很小,那在更新w的时候基本就不更新了。而不把权重设置为0,是因为无论训练多久,在更新权重的时候,所有权重都会被更新成相同的值,这样多层隐藏层就没有意义了。严格来说,是为了瓦解权重的对称结构

接下来可以训练我们的模型了

1. 将输入的特征x和对应真实值label y通过zip函数打包。将输入x经过模型 w *x + b 的预测输出预测值y

2. 计算损失函数loss,因为之前将w、b都是设置成会计算梯度的,那么loss.backward() 会自动计算w和b的梯度。用w的值data,减去梯度的值grad.data 乘上 学习率lr完成一次更新

3. 当w、b梯度不为零的话,要清零。这里有两种解释,第一种是每次计算完梯度后,值会和之前计算的梯度值进行累加,而我们只是需要当前这步的梯度值,所有我们需要将之前的值清零。第二种是,因为梯度的累加,那么相当于实现一个很大的batch训练。假如一个epoch里面,梯度不进行清零的话,相当于把所有的样本求和后在进行梯度下降,而不是我们原先使用的针对单个样本进行下降的SGD算法

4. 每100次迭代后,我们打印一下损失

4. 绘制图像

scatter 相当于离散点的绘图

要绘制连续的图像,只需要给个定义域然后通过表达式 w * x +b 计算y就可以了,最后输出一下w和b,看看是不是和我们设置的w = 2,b =3 接近

5. 代码

import torch
import matplotlib.pyplot as plt
def trainSet(batch_size = 20):   # 定义训练集
    x = torch.rand(batch_size,1) * 10
    y = x * 2 + 3 + torch.randn(batch_size,1)   # y = x * 2  + 3(近似)
    return x,y
train_x, train_y = trainSet()   # 训练集
w =torch.randn(1,requires_grad= True)
b = torch.zeros(1,requires_grad= True)
lr = 0.001
for epoch in range(1000):
    for x,y in zip(train_x,train_y):  # SGD算法,如果是BSGD的话,不需要这个for
        y_pred = w*x  + b
        loss = (y - y_pred).pow(2) / 2
        loss.backward()
        w.data -= w.grad.data * lr
        b.data -= b.grad.data * lr
        if w.data is not True:   # 梯度值不为零的话,要清零
            w.grad.data.zero_()   #  否则相当于一个大的batch训练
        if b.data is not True:
            b.grad.data.zero_()
    if epoch % 100 ==0:
        print('loss:',loss.data)
plt.scatter(train_x,train_y)
x = torch.arange(0,11).view(-1,1)
y = x * w.data + b.data
plt.plot(x,y)
plt.show()
print(w.data,b.data)

输出的图像

输出的结果为

这里可以看的最后的w = 1.9865和b = 2.9857 和我们设置的2,3是接近的

到此这篇关于Python反向传播实现线性回归步骤详细讲解的文章就介绍到这了,更多相关Python线性回归内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 人工智能—Python实现线性回归

    1.概述 (1)人工智能学习 (2)机器学习 (3)有监督学习 (4)线性回归 2.线性回归 (1)实现步骤 根据随机初始化的 w x b 和 y 来计算 loss 根据当前的 w x b 和 y 的值来计算梯度 更新梯度,循环将新的 w′ 和 b′ 复赋给 w 和 b ,最终得到一个最优的 w′ 和 b′ 作为方程最终的 (2)数学表达式 3.代码实现(Python) (1)机器学习库(sklearn.linear_model) 代码: from sklearn import linear_m

  • Python线性回归图文实例详解

    目录 前言: 1.简单线性回归模型 2.多元线性回归模型 2.1 应用F检验法完成模型的显著性检验 2.2应用t检验法完成回归系数的显著性检验 3.基于回归模型识别异常点 4.含有离散变量的回归模型 1.删除无意义的变量 2.哑变量转换 3.将数据拆分为两部分 4.构建多元线性回归模型 5.未知年龄的预测 总结 前言: 线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(即自变量)来预测某个连续的数值变量(即因变量).例如餐厅根据媒体的营业数据(包括菜谱价格.就餐人数.预订人数.

  • Python实现多元线性回归的梯度下降法

    目录 1. 读取数据 2.定义代价函数 3. 梯度下降 4.可视化展示 1. 读取数据 首先要做的就是读取数据,请自行准备一组适合做多元回归的数据即可.这里以data.csv为例,这里做的是二元回归.导入相关库,及相关代码如下. import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D data = np.loadtxt("data.csv", delimiter

  • python基于numpy的线性回归

    本文实例为大家分享了python基于numpy的线性回归的具体代码,供大家参考,具体内容如下 class类中包含: 创建数据参数初始化计算输出值,损失值,dw,db预测函数交叉验证函数 其中用到的数据集为sklearn中的糖尿病数据集 具体代码如下: import numpy as np from sklearn.utils import shuffle from sklearn.datasets import load_diabetes import matplotlib.pyplot as

  • python实现线性回归的示例代码

    目录 1线性回归 1.1简单线性回归 1.2多元线性回归 1.3使用sklearn中的线性回归模型 1线性回归 1.1简单线性回归 在简单线性回归中,通过调整a和b的参数值,来拟合从x到y的线性关系.下图为进行拟合所需要优化的目标,也即是MES(Mean Squared Error),只不过省略了平均的部分(除以m). 对于简单线性回归,只有两个参数a和b,通过对MSE优化目标求极值(最小二乘法),即可求得最优a和b如下,所以在训练简单线性回归模型时,也只需要根据数据求解这两个参数值即可. 下面

  • python数据分析之线性回归选择基金

    目录 1 前言 2 基金趋势分析 3 数据抓取与分析 3.1 基金数据抓取 3.2 数据分析 4 总结 1 前言 在前面的章节中我们牛刀小试,一直在使用python爬虫去抓取数据,然后把数据信息存放在数据库中,至此已经完成了基本的基本信息的处理,接下来就来处理高级一点儿的内容,今天就从基金的趋势分析开始. 2 基金趋势分析 基金的趋势,就是选择一些表现强势的基金,什么样的才是强势呢?那就是要稳定的,逐步的一路北上.通常情况下,基金都会沿着一条趋势线向上或者向下,基金的趋势形成比股票的趋势更加确定

  • Python 机器学习之线性回归详解分析

    为了检验自己前期对机器学习中线性回归部分的掌握程度并找出自己在学习中存在的问题,我使用C语言简单实现了单变量简单线性回归. 本文对自己使用C语言实现单变量线性回归过程中遇到的问题和心得做出总结. 线性回归 线性回归是机器学习和统计学中最基础和最广泛应用的模型,是一种对自变量和因变量之间关系进行建模的回归分析. 代码概述 本次实现的线性回归为单变量的简单线性回归,模型中含有两个参数:变量系数w.偏置q. 训练数据为自己使用随机数生成的100个随机数据并将其保存在数组中.采用批量梯度下降法训练模型,

  • Python构建简单线性回归模型

    目录 线性回归模型 1.加载数据 2.划分训练集和测试集 3.训练模型 4.预测数据 5.画图展示线性拟合情况 6.预测数据测试 评估模型精度 1.计算回归模型精度 模型持久化 前言: 本文介绍如何构建简单线性回归模型及计算其准确率,最后介绍如何持久化模型. 线性回归模型 线性回归表示发现函数使用线性组合表示输入变量.简单线性回归很容易理解,使用了基本的回归技术,一旦理解了这些基本概念,可以更好地学习其他类型的回归模型. 回归用于发现输入变量和输出变量之间的关系,一般变量为实数.我们的目标是估计

  • python机器学习基础线性回归与岭回归算法详解

    目录 一.什么是线性回归 1.线性回归简述 2.数组和矩阵 数组 矩阵 3.线性回归的算法 二.权重的求解 1.正规方程 2.梯度下降 三.线性回归案例 1.案例概述 2.数据获取 3.数据分割 4.数据标准化 5.模型训练 6.回归性能评估 7.梯度下降与正规方程区别 四.岭回归Ridge 1.过拟合与欠拟合 2.正则化 一.什么是线性回归 1.线性回归简述 线性回归,是一种趋势,通过这个趋势,我们能预测所需要得到的大致目标值.线性关系在二维中是直线关系,三维中是平面关系. 我们可以使用如下模

  • Python反向传播实现线性回归步骤详细讲解

    目录 1. 导入包 2. 生成数据 3. 训练数据 4. 绘制图像 5. 代码 1. 导入包 我们这次的任务是随机生成一些离散的点,然后用直线(y = w *x + b )去拟合 首先看一下我们需要导入的包有 torch 包为我们生成张量,可以使用反向传播 matplotlib.pyplot 包帮助我们绘制曲线,实现可视化 2. 生成数据 这里我们通过rand随机生成数据,因为生成的数据在0~1之间,这里我们扩大10倍. 我们设置的batch_size,也就是数据的个数为20个,所以这里会产生维

  • Python文件的操作示例的详细讲解

    1. 文件的读写原理: 文件的读写称为I/O操作. 操作原理: .py文件是用解释器去运行,调用OS操作系统的资源,去操作磁盘上的文件. 操作流程: 在去操作一个文件的文件的时候,首先打开或者创建一个文件,进行读或者写. 读: 从文件拿到内存当中来 写:把内存的文件放入文件中 最后进行关闭资源. 内置函数: open() 可以创建或者打开一个文件 语法规则: file=open(filename [mode,encoding] 打开模式默认为只读 默认文本中的字符编码格式为gbk # 作者:互联

  • Python中关于面向对象概念的详细讲解

    面向对象编程的2个非常重要的概念: 类和对象 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 类用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类是由三部分构成: 类的名称 类的属性 类的方法 格式如下: # 类名 class Func(object): # 类的属性 i=123 # 类的方法 def f(self): print('6666') # 实例化类 a=F

  • numpy实现神经网络反向传播算法的步骤

    一.任务 实现一个4 层的全连接网络实现二分类任务,网络输入节点数为2,隐藏层的节点数设计为:25,50,25,输出层2 个节点,分别表示属于类别1 的概率和类别2 的概率,如图所示.我们并没有采用Softmax 函数将网络输出概率值之和进行约束,而是直接利用均方差误差函数计算与One-hot 编码的真实标签之间的误差,所有的网络激活函数全部采用Sigmoid 函数,这些设计都是为了能直接利用梯度推导公式. 二.数据集 通过scikit-learn 库提供的便捷工具生成2000 个线性不可分的2

  • Python中turtle绘图模块的详细讲解

    目录 前言 turtle基本概念 调出模块 引用turtle模块(库)方法 例.写字函数write()的使用 使用Python的turtle(海龟)模块画图步骤 总结 前言 turtle库是Python语言中一个很流行的绘制图像的函数库,可以轻松地绘制出精美的形状和图案,很适合用来引导孩子学习编程. turtle模块(module)是Python语言中的标准模块(内置模块)之一. [在Python中,模块也称作库(Library)] turtle基本概念 画布(canvas),turtle模块展

  • 基于Python的GUI图形用户界面编程详细讲解

    目录 前言 常用的GUI库 1.Tkinter 2.wxPython 3.PyQT 基于tkinter模块创建GUI程序步骤 主窗口设置 主窗口位置和大小 GUI编程整体描述 常用组件汇总列表 GUI应用程序类的经典写法 总结 前言 在最早程序的设计中,程序和用户的交互都是通过控制台来完成的,而GUI(Graphics User Interface),即图形用户编程,是Python 所提供的一个丰富的组件,可以快速的实现使用图形界面和用户交互. 常用的GUI库 1.Tkinter tkinter

  • Python I/O与进程的详细讲解

    I/O with语句 with context_expression [as target(s)]: with-body context_expression返回值遵从上下文管理协议,包含__enter__()与__exit__()方法,as语句的target(s)得到的是__enter__()返回值,执行with-body后会调用上下文管理器的__exit__()方法,使用with语句,可以减轻某些代码编写负担,比如文件读写. 读文件 try: f = open('/path/to/file'

  • python绘图之坐标轴的超详细讲解

    目录 1. 2D坐标轴 1.1 绘制简单的曲线 1.2 坐标轴的刻度线向内 1.3 将坐标刻度从整0开始 1.4 设置刻度栅格 1.5 不显示坐标 1.6 坐标值 1.7 绘制横线和竖线 1.8 设置坐标点的颜色 1.9 双坐标 2. 3D坐标轴 2.1 绘制3D散点图 2.2 绘制3D曲面图 2.3 绘制3D柱形图 引用 总结 1. 2D坐标轴 1.1 绘制简单的曲线 import matplotlib.pyplot as plt import numpy as np x=np.linspac

  • python中最小二乘法详细讲解

    python中在实现一元线性回归时会使用最小二乘法,那你知道最小二乘法是什么吗.其实最小二乘法为分类回归算法的基础,从求解线性透视图中的消失点,m元n次函数的拟合,包括后来学到的神经网络,其思想归根结底全都是最小二乘法.本文向大家介绍python中的最小二乘法. 一.最小二乘法是什么 最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出). 二.最小二乘法实现原理 通过最小化误差的平方和寻找数据的最佳函数匹配. 三.最小二乘法功

  • 超详细讲解python正则表达式

    目录 正则表达式 1.1 正则表达式字符串 1.1.1 元字符 1.1.2 字符转义 1.1.3 开始与结束字符 1.2 字符类 1.2.1 定义字符类 1.2.2 字符串取反 1.2.3 区间 1.2.4 预定义字符类 1.3 量词 1.3.1 量词的使用 1.3.2 贪婪量词和懒惰量词 1.4 分组 1.4.1 分组的使用 1.4.2 分组命名 1.4.3 反向引用分组 1.4.4 非捕获分组 1.5 re模块 1.5.1 search()和match()函数 1.5.2 findall()

随机推荐