当前位置: 首页 > news >正文

03.1线性回归

文章目录

    • 3.1 线性回归
      • 3.1.1 线性回归的基本元素
          • 3.1.1.1 线性模型
          • 3.1.1.2 损失函数
          • 3.1.1.3. 解析解
          • 3.1.1.4. 随机梯度下降
          • 3.1.1.5. 用模型进行预测
      • 3.1.2. 矢量化加速
      • 3.1.3. 正态分布与平方损失
      • 3.1.4. 从线性回归到深度网络
        • 3.1.4.1. 神经网络图
        • 3.1.4.2. 生物学
      • 3.1.5. 小结

3.1 线性回归

  • 回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。
  • 在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。
  • 常见例子
    • 预测价格(房屋、股票等)
    • 预测住院时间(针对住院病人等)
    • 预测需求(零售销量等)

3.1.1 线性回归的基本元素

线性回归基于几个简单的假设:

  • 首先,假设自变量X和因变量Y之间的关系是线性的,即Y可以表示为X中元素的加权和,这里通常允许包含观测值的一些噪声;
  • 其次,我们假设任何噪声都比较正常,如噪声遵循正态分布。

常用术语

  • 训练数据集(training data set) 或训练集(training set)
  • 样本(sample)
  • 标签(label)或目标(target)
  • 特征(feature)
3.1.1.1 线性模型

线性假设是指目标(房屋价格)可以表示为特征(面积和房龄)的加权和,如下面的式子:
y = wx +b
w : 权重
b :偏置,常数

寻找最好的模型参数(model parameters)w和b之前, 我们还需要两个东西:

  • 一种模型质量的度量方式;
  • 一种能够更新模型以提高模型预测质量的方法。
3.1.1.2 损失函数

损失函数(loss function)能够量化目标的实际值与预测值之间的差距。
通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0

回归问题中最常用的损失函数是平方误差函数。

3.1.1.3. 解析解
  • 线性回归的解可以用一个公式简单地表达出来, 这类解叫作解析解(analytical solution)
  • 像线性回归这样的简单问题存在解析解,但并不是所有的问题都存在解析解。
  • 解析解可以进行很好的数学分析,但解析解对问题的限制很严格,导致它无法广泛应用在深度学习里。
3.1.1.4. 随机梯度下降

梯度下降(gradient descent)这种方法几乎可以优化所有深度学习模型。
它通过不断地在损失函数递减的方向上更新参数来降低误差。

  • 梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值) 关于模型参数的导数(在这里也可以称为梯度)
  • 小批量随机梯度下降(minibatch stochastic gradient descent):通常会在每次需要计算更新的时候随机抽取一小批样本
  • 批量大小和学习率的值通常是手动预先指定,而不是通过模型训练得到的。
  • 以调整但不在训练过程中更新的参数称为超参数(hyperparameter)
  • 调参(hyperparameter tuning)是选择超参数的过程。
  • 超参数通常是我们根据训练迭代结果来调整的, 而训练迭代结果是在独立的验证数据集(validation dataset)上评估得到的。
  • 泛化(generalization):找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失
3.1.1.5. 用模型进行预测

给定特征估计目标的过程通常称为预测(prediction)或推断(inference)

3.1.2. 矢量化加速

对计算进行矢量化, 从而利用线性代数库
实例验证
我们实例化两个全为1的10000维向量。 在一种方法中,我们将使用Python的for循环遍历向量; 在另一种方法中,我们将依赖对+的调用。

%matplotlib inline
import math
import time
import numpy as np
import torch
from d2l import torch as d2l

n = 10000
a = torch.ones(n)
b = torch.ones(n)

# 定义一个计时器
class Timer:  #@save
    """记录多次运行时间"""
    def __init__(self):
        self.times = []
        self.start()

    def start(self):
        """启动计时器"""
        self.tik = time.time()

    def stop(self):
        """停止计时器并将时间记录在列表中"""
        self.times.append(time.time() - self.tik)
        return self.times[-1]

    def avg(self):
        """返回平均时间"""
        return sum(self.times) / len(self.times)

    def sum(self):
        """返回时间总和"""
        return sum(self.times)

    def cumsum(self):
        """返回累计时间"""
        return np.array(self.times).cumsum().tolist()
        
# for循环,每次执行一位的加法
c = torch.zeros(n)
timer = Timer()
for i in range(n):
    c[i] = a[i] + b[i]
f'{timer.stop():.5f} sec'
'0.08695 sec'


# 重载的+运算符来计算按元素的和
timer.start()
d = a + b
f'{timer.stop():.5f} sec'
'0.00025 sec'

矢量化代码通常会带来数量级的加速。
减少了出错的可能性

3.1.3. 正态分布与平方损失

对噪声分布的假设来解读平方损失目标函数

  • 正态分布(normal distribution),也称为高斯分布(Gaussian distribution)
  • 噪声服从正态分布

3.1.4. 从线性回归到深度网络

3.1.4.1. 神经网络图

将线性回归模型描述为一个神经网络。
需要注意的是,该图只显示连接模式,即只显示每个输入如何连接到输出,隐去了权重和偏置的值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wek3m4Za-1662219434913)(https://zh.d2l.ai/_images/singleneuron.svg)]

对于线性回归,每个输入都与每个输出(在本例中只有一个输出)相连, 将这种变换 称为全连接层(fully-connected layer)或称为稠密层(dense layer)。

3.1.4.2. 生物学

在深度学习中的灵感同样或更多地来生物学、自数学、统计学和计算机科学。

3.1.5. 小结

  • 机器学习模型中的关键要素是训练数据、损失函数、优化算法,还有模型本身。

  • 矢量化使数学表达上更简洁,同时运行的更快。

  • 最小化目标函数和执行极大似然估计等价。

  • 线性回归模型也是一个简单的神经网络。

相关文章:

  • 【智能优化算法】基于觅食生境选择的改进粒子群算法(FHSPSO)附 Matlab代码
  • 密码相关----对称加密,非对称加密
  • 02.1、数据操作
  • 离散数学 --- 命题逻辑 -- 命题符号化与命题公式
  • 回坑记之或许是退役赛季?
  • 初识OpenGL (-)EBO元素缓冲对象(Element Buffer Object)
  • typescript真的有学习的必要吗?
  • PyTorch Lightning入门教程(二)
  • 【滤波跟踪】基于变分贝叶斯卡尔曼滤波器实现目标跟踪附matlab代码
  • C++ mutex 与 condition_variable
  • 基础 | Spring - [单例创建过程]
  • K8S集群Pod资源自动扩缩容方案
  • SPPNet
  • java多线程-多线程技能
  • 网课查题接口 该怎么搭建
  • ES6系统学习----从Apollo Client看解构赋值
  • HTML-表单
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java面向对象及其三大特征
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • oldjun 检测网站的经验
  • PV统计优化设计
  • Python实现BT种子转化为磁力链接【实战】
  • python学习笔记-类对象的信息
  • Spring Boot MyBatis配置多种数据库
  • 半理解系列--Promise的进化史
  • 创建一个Struts2项目maven 方式
  • 二维平面内的碰撞检测【一】
  • 使用agvtool更改app version/build
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信小程序填坑清单
  • 温故知新之javascript面向对象
  • 学习HTTP相关知识笔记
  • 由插件封装引出的一丢丢思考
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (4) PIVOT 和 UPIVOT 的使用
  • (C)一些题4
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (全注解开发)学习Spring-MVC的第三天
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)appium-desktop定位元素原理
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net 7 上传文件踩坑