【深度学习】S2 数学基础 P1 线性代数(上)

news2024/11/30 14:43:06

目录

  • 基本数学对象
    • 标量与变量
    • 向量
    • 矩阵
    • 张量
    • 降维求和
    • 非降维求和
    • 累计求和
  • 点积与向量积
    • 点积
    • 矩阵-向量积
    • 矩阵-矩阵乘法

深度学习的三大数学基础 —— 线性代数、微积分、概率论;
自本篇博文以下几遍博文,将对这三大数学基础进行重点提炼。

本节博文将介绍线性代数知识,为线性代数第一部分。包含基本数学对象、算数和运算,并用数学符号和相应的张量代码实现表示它们。


基本数学对象

基本数学对象包含:

  • 0维:标量与变量
  • 1维:向量
  • 2维:矩阵

标量与变量

一个简单的温度转换计算表达式,
c = 5 9 ( f − 52 ) c = \frac 5 9 (f-52) c=95(f52)

其中 c 代表摄氏度,而 f 代表华氏度。
而这个计算表达式中,数值 5、9、52 是标量值,而未知的标量值,即自变量 f 与因变量 c,都是变量值。

标量与变量在张量中,由只有一个元素的张量来表示。

import torch
# 实例化两个标量
x = torch.tensor(3.0)
y = torch.tensor(2.0)

# 执行算数运算
print("x+y=", x+y, "\nx*y=", x*y, '\nx/y=', x/y, '\nx**y=', x**y)
x+y= tensor(5.) 
x*y= tensor(6.) 
x/y= tensor(1.5000) 
x**y= tensor(9.)

P.S. 在线性代数中,标量与变量通常用小写不加粗的字母表示, a a a


向量

向量可以视为由一系列标量值组成的列表,这些标量值被称为向量的元素或者分量。当使用向量来表示数据集中的样本时,它们通常具有一定的现实意义。例如一个用于表征用户个人信息的样本可以使用向量表示用户的年龄、性别、收入等标量信息。

使用张量表示向量,通常使用一维张量;

import torch

x = torch.arange(4)
print(x)
tensor([0, 1, 2, 3])

索引: 访问向量中的元素,可以直接通过索引值来访问;

print(x[-1])

长度: 所谓向量的长度,指的是向量中标量的个数,通过 len() 函数获取;

print(len(x))

形状: 通过 .shape 属性访问向量的形状。形状是一个元素组,列出张量沿每个轴的长度(维数)。而对于只有一个轴的张量,其形状只有一个元素。

print(x.shape)

P.S. 在线性代数中,向量通常使用粗体小写字母表示: a \mathbf{a} a


矩阵

正如向量是将标量从零阶推广到一阶,矩阵则是将向量从一阶推广到二阶。矩阵 A m n \mathbf{A_{mn}} Amn m m m n n n 列标量组成,其中每个元素 a i j a_{ij} aij 是矩阵中第 i i i j j j 列元素。

使用张量表示矩阵,使用二维张量;

import torch

x = torch.arange(20).reshape(5, 4)
print(x)
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])

索引: 访问矩阵中元素,通过行索引( i i i)和列索引( j j j)来访问矩阵中的标量元素 a i j a_{ij} aij

# 访问第二行第三个元素
print(x[1][2])

转置: 交换矩阵的行和列称为矩阵的转置( A T \mathbf{A^T} AT)。对于 B = A T \mathbf{B}=\mathbf{A^T} B=AT,有 b i j = a j i b_{ij}=a_{ji} bij=aji

print(x.T)
tensor([[ 0,  4,  8, 12, 16],
        [ 1,  5,  9, 13, 17],
        [ 2,  6, 10, 14, 18],
        [ 3,  7, 11, 15, 19]])

对称矩阵: 对称矩阵是特殊的方阵,方阵是特殊的矩阵。对于矩阵 A m n \mathbf{A_{mn}} Amn,有方阵( m = n m=n m=n),对称矩阵( A = A T \mathbf{A}=\mathbf{A^T} A=AT

B = torch.tensor([[1, 2, 3],
                  [2, 0, 4],
                  [3, 4, 5]])

print(B == B.T)
tensor([[True, True, True],
        [True, True, True],
        [True, True, True]])

矩阵是很有用的数据结构,其中的行可对应于不同的数据样本,列对应着不同的属性。


张量

现实世界并非是单纯的二维世界。图片,通常由 RGB 三个颜色通道构成,这就需要一个三维的数据结构来表示。而张量,可以用来表示任意维度数的数据结构。例如:向量是一阶张量,矩阵是二阶张量。

张量算法有两个基本性质:

  • 按元素运算: 两个张量按元素运算,要求其形状 shape 必须相同,张量中对应位置的标量将进行运算操作。
import torch

x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print("x=", x)
print("y=", y)
print("x+y=", x+y)
x= tensor([1., 2., 4., 8.])
y= tensor([2, 2, 2, 2])
x+y= tensor([ 3.,  4.,  6., 10.])
  • 广播机制: 张量的广播机制用于将张量扩展,要求两个向量要分别满足形状( x x x, y y y)与( y y y, z z z)方才可以进行运算。
import torch

a = torch.arange(3).reshape(3, 1)
b = torch.arange(2).reshape(1, 2)

print("a=", a)
print("b=", b)
print("a*b=", a*b)
a= tensor([[0],
        [1],
        [2]])
b= tensor([[0, 1]])
a*b= tensor([[0, 0],
        [0, 1],
        [0, 2]])

更多关于张量的操作博文,请移步:【深度学习】S1 预备知识 P1 张量


降维求和

对于一个张量,我们可以使用函数 sum() 进行简答求和;

import torch

x = torch.arange(12).reshape(3, -1)
print(x)
print(x.sum())
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
tensor(66)

在默认情况下,调用求和函数会降低张量的维度直到变成一个标量。但是我们也可以通过 sum() 函数中的变量 axis= 来指定张量沿哪一个轴来进行求和操作。比如;

print(x.sum(axis=0))
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
tensor([12, 15, 18, 21])

通过在函数 sum() 中设置 axis= 参数,我们可以沿着二维张量的横坐标将其合并成一维的张量向量。

另外,针对多维张量,我们还可以通过将 axis 参数设置为一个数组,来实现同时降低多个维度到指定的维度。

print(x.sum(axis=[0, 1]))
tensor(66)

观察结果可知,数据维度降至默认的标量形式。


非降维求和

然而,在某些情况下,我们可能希望保留计算出的和的结果的原始维度,此时,在 sum(axis=) 函数中需要增加设置 keepdims 参数;

print(x.sum(axis=0))
print(x.sum(axis=0, keepdims=True))
# 打印维度信息
print((x.sum(axis=0)).shape)
print((x.sum(axis=0, keepdims=True)).shape)
tensor([12, 15, 18, 21])
tensor([[12, 15, 18, 21]])
# 维度信息
torch.Size([4])
torch.Size([1, 4])

观察两个结果的对比,明显可以看出它们的维度存在差异。


累计求和

使用 cumsum() 函数,可以实现张量在某一维度上的累加求和操作。

import torch

x = torch.arange(12).reshape(3, -1)
print(x)
print(x.cumsum(axis=0))
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
tensor([[ 0,  1,  2,  3],
        [ 4,  6,  8, 10],
        [12, 15, 18, 21]])

可以观察到,张量在其维度上进行逐层累加求和。如上,便是 cumsum() 函数。


点积与向量积

点积

点积(也称为内积)是指两个张量在对应位置上元素相乘后的和。

import torch

x = torch.arange(4, dtype=torch.float32)
y = torch.ones(4, dtype=torch.float32)
print("x=", x)
print("y=", y)
print(torch.dot(x, y))
x= tensor([0., 1., 2., 3.])
y= tensor([1., 1., 1., 1.])
tensor(6.)

上述结果: 6 = 0 ∗ 1 + 1 ∗ 1 + 2 ∗ 1 + 3 ∗ 1 6 = 0*1+1*1+2*1+3*1 6=01+11+21+31


矩阵-向量积

矩阵向量积,指的是矩阵与向量的乘法,也就是将矩阵与向量相乘得到一个新的向量。

e . g . e.g. e.g. 假设我们有矩阵 A \mathbf{A} A 和向量 v \mathbf{v} v,其中 A \mathbf{A} A 是一个 m ∗ n m*n mn 矩阵, v \mathbf{v} v 是一个 n n n 维向量,那么它们的向量积 A v \mathbf{Av} Av 是一个 m m m 维向量;

在这里插入图片描述

读者可以借助以下张量的示例来增进理解。

在张量中,通过 mv() 函数来实现矩阵向量积;其中 m m m 意味着矩阵 matrix, v v v 意味着向量 vector;

import torch

x = torch.arange(20, dtype=torch.float32).reshape(5, 4)
y = torch.ones(4, dtype=torch.float32)
print("x=", x)
print("y=", y)
print(torch.mv(x, y))
x= tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [12., 13., 14., 15.],
        [16., 17., 18., 19.]])
y= tensor([1., 1., 1., 1.])
tensor([ 6., 22., 38., 54., 70.])

矩阵-矩阵乘法

矩阵与矩阵乘法,可以看作简单地执行多次矩阵-向量积,并将结果拼接在一起形成矩阵。假设有两个矩阵 A \mathbf{A} A B \mathbf{B} B,其中 A \mathbf{A} A 是一个 m × n m×n m×n 的矩阵, B \mathbf{B} B 是一个 n × p n×p n×p 的矩阵,那么它们的乘积 C = A × B C=A×B C=A×B 是一个 m × p m×p m×p 的矩阵。

在这里插入图片描述

e . g . e.g. e.g. 矩阵-矩阵乘法使用 mm() 函数实现;

import torch

x = torch.arange(20, dtype=torch.float32).reshape(5, 4)
y = torch.ones(12, dtype=torch.float32).reshape(4, 3)
print("x=", x)
print("y=", y)
print(torch.mm(x, y))
x= tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [12., 13., 14., 15.],
        [16., 17., 18., 19.]])
y= tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
tensor([[ 6.,  6.,  6.],
        [22., 22., 22.],
        [38., 38., 38.],
        [54., 54., 54.],
        [70., 70., 70.]])

以上便是深度学习数学基础,线性代数第一部分;
线性代数第二部分将讲述 L 1 L1 L1 范数以及 L 2 L2 L2 范数,以及其张量实现。

如有任何问题,请留言或联系!谢谢!!

2024.2.13

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1447551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode、72. 编辑距离【中等,二维DP】

文章目录 前言LeetCode、72. 编辑距离【中等,二维DP】题目链接与分类二维DP 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容…

C++笔记1:操纵符输入输出

C操纵符用来控制输出控制,一是输出的形式,二是控制补白的数量和位置。本文记录一下,在一些笔试的ACM模式可能有用。其中1-4节的部分是关于格式化输入输出操作,5-6节的部分是关于未格式化输入输出操作。 1. 控制布尔值的格式 一般…

嵌入式Qt 计算器界面设计

一.计算器界面设计 计算机界面程序分析&#xff1a; 需要用到的组件&#xff1a; 界面设计&#xff1a; 界面设计实现&#xff1a; 实验1&#xff1a;计算器界面设计 #include <QtGui/QApplication> #include <QWidget> //主窗口 #include <QLineEdit> //文…

医院排队叫号系统的设计与实践

随着医疗服务需求的增加&#xff0c;医院排队叫号系统成为了现代医院管理的必备工具。它不仅可以提高医院服务效率&#xff0c;减少患者等待时间&#xff0c;还可以优化医院资源利用&#xff0c;提升患者就诊体验。本文将介绍医院排队叫号系统的设计与实践&#xff0c;包括系统…

autojs通过正则表达式获取带有数字的text内容

视频连接 视频连接 参考 参考 var ctextMatches(/\d/).findOne()console.log("当前金币"c.text()) // 获取当前金币UiSelector.textMatches(reg) reg {string} | {Regex} 要满足的正则表达式。 为当前选择器附加控件"text需要满足正则表达式reg"的条件。 …

三分钟教你如何把不要钱的ChatGPT3.5用出花钱4.0的效果!

三分钟教你如何把不要钱的ChatGPT3.5用出花钱4.0的效果&#xff01; 关注微信公众号 DeepGo 计算机杂谈及深度学习记录&分享 上一期我们聊到 ChatGPT4.0确实在各方面都优于3.5 花了钱的就是不一样 但我们有没有办法去弥补这一差距呢&#xff1f; 今天我就来教你 转发出去让…

海量数据处理商用短链接生成器平台 - 4

第六章 架构核心技术-池化思想-异步结合 性能优化最佳实践 第1集 RestTemplate里面的存在的问题你知道多少- Broken pipe错误 项目就更新到第六章了&#xff0c;剩下的内容 放百度网盘里面了&#xff0c;需要的来取。 链接&#xff1a;https://pan.baidu.com/s/19LHPw36dsxPB7…

推荐一门 MIT 的计算机入门课

你好&#xff0c;我是坚持分享干货的 EarlGrey&#xff0c;翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。 如果我的分享对你有帮助&#xff0c;请关注我&#xff0c;一起向上进击。 计算机科学及编程导论在MIT的课程编号是6.00.1&#xff0c;是计算机…

Pytorch学习03_TensorBoard使用02

Opencv读取图片&#xff0c;获得numpy型数据类型 复制图片的相对路径 目前这种type不适用&#xff0c;考虑用numpy类型 安装opencv&#xff0c;在pytorch环境下 pip install opencv-python 导入numpy import numpy as np 将PIL类型的img转换为 NumPy 数组 img_arraynp.array…

VC++ 绘制折线学习

win32 有三个绘制折线的函数&#xff1b; Polyline&#xff0c;根据给定点数组绘制折线&#xff1b; PolylineTo&#xff0c;除了绘制也更新当前位置&#xff1b; PolyPolyline&#xff0c;绘制多条折线&#xff0c;第一个参数是点数组&#xff0c;第二个参数是一个数组、指…

【教学类-48-04】202402013“天干地支 六十一甲子”.

背景需求&#xff1a; 2024年是甲辰龙年。 “辛亥革命”“甲午海战”"戊戌变法”都有天干地支的身影。 参观历史建筑&#xff0c;不少书法碑刻上都是用天干地支进行年代记名 所以我用Python来制作60一甲子的所有天干地支组合 60一甲子 天干地支的排序 作者&#xff1a;阿…

【教程】Kotlin语言学习笔记(一)——认识Kotlin(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 文章目录 【Kotlin语言学习】系列文章一、Kotlin介绍二、学习路径 一、…

片上网络NoC(4)——直连拓扑

目录 一、前言 二、直连拓扑 三、总结 一、前言 本文中&#xff0c;我们将继续介绍片上网络中拓扑相关的内容&#xff0c;主要介绍直连拓扑&#xff0c;在此之前&#xff0c;我们已经介绍过了拓扑的指标&#xff0c;这将是继续阅读本文的基础&#xff0c;还没有了解相关内容…

GEE:CART(Classification and Regression Trees)回归教程(样本点、特征添加、训练、精度、参数优化)

作者:CSDN @ _养乐多_ 对于分类问题,这个输出通常是一个类别标签 ,而对于回归问题,输出通常是一个连续的数值。回归可以应用于多种场景,包括预测土壤PH值、土壤有机碳、土壤水分、碳密度、生物量、气温、海冰厚度、不透水面积百分比、植被覆盖度等。 本文将介绍在Google…

Spring Boot 笔记 012 创建接口_添加文章分类

1.1.1 实体类添加校验 package com.geji.pojo;import jakarta.validation.constraints.NotEmpty; import lombok.Data;import java.time.LocalDateTime;Data public class Category {private Integer id;//主键IDNotEmptyprivate String categoryName;//分类名称NotEmptypriva…

华为机考入门python3--(13)牛客13-句子逆序

分类&#xff1a;列表 知识点&#xff1a; 列表逆序&#xff08;和字符串逆序是一样的&#xff09; my_list[::-1] 题目来自【牛客】 def reverse_sentence(sentence): # 将输入的句子分割words sentence.split() # 将单词逆序排列 words words[::-1] # 将单词用空…

车载诊断协议DoIP系列 —— DoIP应用(Application)需求

车载诊断协议DoIP系列 —— DoIP应用(Application)需求 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一…

Java基于微信小程序的电子竞技信息交流平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Java并发基础:DelayQueue全面解析!

内容概要 DelayQueue类专为处理延迟任务设计&#xff0c;它允许开发者将任务与指定的延迟时间关联&#xff0c;并在任务到期时自动处理&#xff0c;从而避免了不必要的轮询和资源浪费&#xff0c;此外&#xff0c;DelayQueue内部基于优先队列实现&#xff0c;确保最先到期的任…

MySQL数据库⑧_索引(概念+理解+操作)

目录 1. 索引的概念和价值 1.1 索引的概念 1.2 索引的价值 2. 磁盘的概念 2.1 磁盘的结构 2.2 操作系统与磁盘交互的基本单位 2.3 MySQL与磁盘交互的基本单位 3. 索引的理解 3.1 主键索引现象和推导 3.2 索引采用的数据结构&#xff1a;B树 3.3 聚簇索引和非聚簇索引…