深度学习中的数据操作(三) 线性代数基础 基于pytorch实现

1.3 线性代数基础

"""
1.3.1 标量

标量指单纯的数值,该数值没有任何其他类似方向的性质,例如温度就是一个标量

在数学表示法中,标量用小写字母表示,这里也均遵循该表示法。同时,我们用 R (特殊的数学表示法,并非单纯字母R)表示所有(连续)实数标量的空间。现在你只要记住表达式 x∈R 是表示 x 是一个实值标量的正式形式,在未来的内容中会严格定义 R 。
"""

import torch
#这里就展示一下标量之间的加减乘除操作
x = torch.tensor(5.0)
y = torch.tensor(6.0)
print(x+y)
print(x-y)
print(x*y)
print(x/y)
print(x**y)

"""1.3.2 向量

向量可以看做一组标量的集合,这些标量值称作该向量的元素。这里并不像高中数学中将向量默认为带方向的标量,每个标量在现实生活中都代表一个指标,不同的元素组合在一起表现成一个事件,例如某件事发生的概率等。我们用粗体、小写的符号来代表向量

在这里,用一维张量来处理向量
"""

z = torch.arange(4)
print(z)  #这就是一个向量,其也有下标表示
print(z[0])

"""1.3.3 长度、维度与形状

在数学表示法中,如果我们想说一个向量x由n个实值标量组成,我们可以将其表示为 x∈R^n 。向量的长度通常称为向量的维度(dimension)。

在上面,我们将一个向量表示成了一个一维张量,那么向量的维度也就表示成了张量的长度。在Python中我们可以通过len(x)来求解张量x的长度.同样的,通过x.shape就可以得出张量的形状,这部分在前面的内容中均有涉及。
"""

print(len(z))
print(z.shape)

"""在此明确一下:向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量,这与初学者固有印象中的理解不一样。 然而,张量的维度用来表示张量具有的轴数。在这个意义上,张量的某个轴的维数就是这个轴的长度。

举个例子:向量[1,2,3,4]其维度是4,轴数为1,表示成张量[1,2,3,4]后,其维度为1,该维度(轴)的长度为4

1.3.4 矩阵与张量

上述中,向量通过一维张量来表示,那么多维向量该如何表示呢?这个解决方法就是矩阵。矩阵用加粗的大写字母表示。我们使用 A∈R^(m×n) 来表示矩阵A,其由m行和n列的实值标量组成。若m=n,那么该矩阵又可称为方阵

矩阵的转置:一个m行n列的矩阵,转置后变为一个n行m列的矩阵。相关的,原来的第一行变成了第一列,以此类推,我们用A^T来表示矩阵A的转置矩阵
"""

A = torch.arange(20,dtype = torch.float32).reshape(5,4)
print(A)

#矩阵的转置
B = A.T
print(B)
print(B == A.T) #每一个对应的元素都相同

"""1.3.5 张量算法的基本性质

在上述过程中,我们已经知道张量和矩阵之间是可以互相转换的。这里就介绍矩阵在张量状态下的运算基本性质。

这里明确:任何按元素的一元运算都不会改变其操作数的形状。给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。同样,给定一个常数,其的相加相乘等性质,也是对应每个元素进行

矩阵的Hadamard积:即对应元素相乘,数学符号为⊙。这并不是基本的矩阵乘法,矩阵乘法多指m*n的矩阵和n*j的矩阵对应行与列相乘。而Hadamard积要求两个矩阵之间行列相同,均为n*m
"""

#矩阵的Hardamard积
B = A.clone()
print(A*B)

#常数与张量之间的运算
num = 5
X = torch.arange(30).reshape(5,6)
print(num + X)
print(num*X)

"""1.3.6 降维

在讲降维之前先要明确张量的加法。对于向量来说,加和就相当于是计算所有元素的和。对于张量来说,.sum()这个函数就可以计算任何形状的张量的和
"""

#张量的加法
print(A)
print(A.sum())

"""同时,张量也可以按照固定的轴进行求和,即降维,下面用二维张量转化为一维张量来阐述。维度通过axis这个参数来表示,0表示行,1表示列"""

A_sum_axis0 = A.sum(axis = 0)
print(A_sum_axis0)
print(A)
print(A_sum_axis0.shape)  #这里就可以说明,若以axis=0进行降维,那么就是将同一列的值全部合入同一行
print(A.shape)

A_sum_axis1 = A.sum(axis = 1)
print(A_sum_axis1)  #这里就是按照行来进行合并了,剩下的就是原本的一列

#那么若axis为0,1的话,该如何合并呢?
A_sum_all = A.sum(axis = [0,1])
print(A_sum_all)  #从结果可以看出,就是先按行或列合并,再按列或行合并

"""张量也可以求解平均值,用到的是.mean()方法。这个方法也有axis参数

"""

print(A.mean())
print(A.sum()/A.numel())  #numel求的是总元素个数
print(A.mean(axis = 0))
print(A.sum(axis = 0)/A.shape[0]) #这是降维的表示方式

"""同时,在求和时也有keepdims这个参数,为True时表示保持原来的轴数。这样也可以计算每行的占比等"""

sum_A = A.sum(axis = 1,keepdims=True)
print(sum_A)
print(A.sum(axis = 1))  #比较两者区别,sum_A是五行一列,A.sum是一行五列 从轴数上来说,sum_A并未改变,仍有两个轴,但A.xum只有一个轴
print(A / sum_A)  #这里就是每行除每行的sum

"""cumsum()函数又可以保证在计算累计总和时,不会降低任何维度"""

print(A.cumsum(axis = 0)) #这里的第二行就是A中第二行加第一行,以此类推
print(A)

"""1.3.7 点积

点积与数学意义上的点积是一致的。同时,点积有两种表示方式,一个是dot()函数,一个是先乘积再求和(即点积的计算方法)
"""

x = torch.arange(4,dtype = torch.float32)
y = torch.ones(4, dtype = torch.float32)
print(torch.dot(x,y))
print(torch.sum(x * y))

"""1.3.8 矩阵-向量积

设A为矩阵,x为向量,则Ax就称为矩阵-向量积

限制条件:

矩阵A的列数应等于x的维度(长度):

例如:A为n行m列的矩阵。用Ai^T表示A的第i列行向量,那么A就是由m个行向量组成的矩阵,x是长度为m的向量。这样,Ax就可以看做是点积。

在Pytorch中可以用mv()函数来求解,只需保证上述限制条件即可
"""

A = torch.arange(20).reshape(5,4)
x = torch.arange(4)
print(A)
print(x)
print(torch.mv(A,x))

"""1.3.9 矩阵-矩阵积

有矩阵-向量积,自然也有矩阵-矩阵积

参照上面的限制条件,我们可以发现,若AB两个矩阵相乘,A为三行四列,B为四行五列,这样,当我们将A看做三个行向量的组合,B看做五个列向量的组合时,才可以通过点积来获得一个三行五列的矩阵-矩阵积。因此A*B需要保证A的列数等于B的行数
"""

A = torch.arange(20).reshape(5,4)
B = torch.arange(24).reshape(4,6)
print(torch.mm(A,B))

"""1.3.10 范数

这里需要明确的是,范数并不是一个数,而是一个运算符,这个运算符告诉我们一个向量的大小。这里的大小不是维度的多少,而是各个分量的大小。

在线性代数中,范数的运算定义是通过一定的规范函数f,将向量映射到f上。

范数满足的三个基本性质:

1.f(αx)=|α|f(x)

2.f(x+y)≤f(x)+f(y)

3.f(x)≥0 这里说明范数是非负的,要求范数最小为0,当且仅当向量全由0组成

下面介绍常用的范数。

L2范数(欧几里得距离):可以记为向量每个元素的平方和开平方根

L1范数:向量每个元素的绝对值加和

Lp范数:可以记为向量每个元素的p次方之和开p次方根

矩阵的Frobenius范数:就是矩阵每个元素的平方和开根号,类似于L2范数

范数的应用:

在深度学习中,我们经常试图解决优化问题: 最大化分配给观测数据的概率; 最小化预测和真实观测之间的距离。 用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。 目标,或许是深度学习算法最重要的组成部分(除了数据),通常被表达为范数。
"""

#L2范数的实现
A = torch.tensor([1.0,2.0,3.0,-4.0])
print(torch.norm(A))

#L1范数的实现
print(torch.abs(A).sum())

#Frobenius范数的实现
print(torch.norm(torch.ones(5,4)))

'''
课后作业:
1.证明一个矩阵 A 的转置的转置是 A ,即 (A⊤)⊤=A 。

2.给出两个矩阵 A 和 B ,证明“它们转置的和”等于“它们和的转置”,即 A⊤+B⊤=(A+B)⊤ 。

3.给定任意方阵 A , A+A⊤ 总是对称的吗?为什么?

4.我们在本节中定义了形状 (2,3,4) 的张量X。len(X)的输出结果是什么?

5.对于任意形状的张量X,len(X)是否总是对应于X特定轴的长度?这个轴是什么?

6.运行A/A.sum(axis=1),看看会发生什么。你能分析原因吗?

7.考虑一个具有形状 (2,3,4) 的张量,在轴0、1、2上的求和输出是什么形状?

8.为linalg.norm函数提供3个或更多轴的张量,并观察其输出。对于任意形状的张量这个函数计算得到什么?
'''
#1
A = torch.tensor([[1,2,3],[4,5,6],[7,8,9]])
B = torch.tensor([[1,2,3],[4,5,6],[7,8,9]])
print(A)
print(A.T.T)
#2
print(A.T+B.T)
print((A+B).T)
#3
A = torch.rand(25).reshape(5,5)
print(A)
print(A + A.T)
#4,5
A = torch.arange(24).reshape(2,3,4)
print(A)
print(len(A))   #是第0轴的长度
#6
A = torch.arange(25).reshape(5,5)
print(A)
print(A.sum(axis = 1))
print(A/A.sum(axis = 1))    #是A的元素与A.sum(axis = 1)对应列上的元素相除的结果
#7
A = torch.arange(24).reshape(2,3,4)
print(A)
print(A.sum(axis = 0))  #相当于2合1,变为1,3,4
print(A.sum(axis = 1))  #相当于对应行合起来,变为2,1,4
print(A.sum(axis = 2))  #相当于对应列合起来,变为2,3,1
#8
A = torch.tensor([[[ 0,  1.0,  2.0,  3.0],
         [ 4.0,  5.0,  6.0,  7.0],
         [ 8.0,  9.0, 10.0, 11.0]],

        [[12.0, 13.0, 14.0, 15.0],
         [16.0, 17.0, 18.0, 19.0],
         [20.0, 21.0, 22.0, 23.0]]])
print(A)
print(torch.norm(A))    #相当于Frobenius范数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值