携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
在上一篇文章中,我们介绍pytorch中的in-place操作和广播机制、取整/取余运算、比较运算、三角函数和其他数学函数
今天,我们来介绍Tensor统计学相关的函数、分布函数、随机抽样、线性代数运算、矩阵分解——PCA、SVD分解——LDA。
-
4.1 Tensor统计学相关的函数
- 4.1.1 对Tensor进行求平均,求和,累积
a = torch.rand(2, 2)
print(a)
print(torch.mean(a))
print(torch.sum(a))
print(torch.prod(a))
运行结果:
tensor([[0.7102, 0.9606],
[0.2648, 0.9575]])
tensor(0.7233)
tensor(2.8932)
tensor(0.1730)
- 4.1.2 还可以对Tensor进行某一维度上的求平均,求和,累积,dim=0,就是对0轴进行操作
a = torch.rand(2, 2)
print(a)
print(torch.mean(a, dim=0))
print(torch.sum(a, dim=0))
print(torch.prod(a, dim=0))
运行结果:
tensor([[0.7102, 0.9606],
[0.2648, 0.9575]])
tensor([0.4875, 0.9591])
tensor([0.9750, 1.9182])
tensor([0.1881, 0.9198])
对某一维度的操作可以完成降维操作
- 4.1.3 返回最大值、最小值
print(torch.argmax(a, dim=0))
print(torch.argmin(a, dim=0))
运行结果:
tensor([0, 0])
tensor([1, 1])
可以看到,返回了最大值最小值所对应的索引值
- 1.1.4 返回标准差,方差,中位数,众数
print(torch.std(a))
print(torch.var(a))
print(torch.median(a))
print(torch.mode(a))
运行结果:
tensor(0.3274)
tensor(0.1072)
tensor(0.7102)
torch.return_types.mode(
values=tensor([0.7102, 0.2648]),
indices=tensor([0, 0]))
- 4.1.5 直方图
a = torch.rand(2, 2) * 10
print(a)
print(torch.histc(a, 6, 0, 0))
最大值和最小值可以自己定义,取0,0就是当前Tensor中的最大值和最小值。
运行结果:
tensor([[2.1703, 2.5295],
[8.6770, 9.1681]])
tensor([2., 0., 0., 0., 0., 2.])
在例子中就是以2.1703为最小值,9.1681为最大值,中间划分成6份,统计结果。
a = torch.randint(0, 10, [10])
print(a)
print(torch.bincount(a))
运行结果:
tensor([8, 4, 0, 0, 5, 1, 5, 6, 1, 4])
tensor([2, 2, 0, 0, 2, 2, 1, 0, 1])
打印出来的Tensor是一个九维的,分别对应的结果就是0出现的频次,1出现的频次...8出现的频次,因为最大值是8,最小值是0,所以长度为九维输出结果。
bincout只能支持一维的Tensor。
bincout统计了某些值得出现得个数,那么它就可以统计某一类别样本的个数。
-
4.2 Tensor分布函数
-
distributioins包含可参数化的概率分布和采样函数
- 得分函数
- 强化学习中策略梯度方法的基础
- pathwise derivative估计器
- 变分自动编码器的重新参数化技巧
- 得分函数
-
KL Divergence: 度量两个函数之间的相似性
-
Transforms: 分布与分布之间的转换
-
Constraint: 分布之间的约束
-
4.3 Tensor中的随机抽样
-
定义随机种子
- torch.manual_seed(seed)
-
定义随机数满足的分布
- torch.normal()
荣国定义随机种子,我们定义了随机序列的起始的值
torch.manual_seed(1)
mean = torch.rand(1, 2)
std = torch.rand(1, 2)
print(torch.normal(mean, std))
运行结果:
tensor([[0.7825, 0.7358]])
如果将随机种子注释掉,第一次和第二次的打印结果是不一样的,如果定义好随机种子之后再去看,会发现和之前的打印结果是一样的。
-
4.4 Tensor中的范数运算
-
范数
- 在泛函分析中,它定义在赋范线性空间中,并满足一定的条件,即
- 非负性
- 齐次性
- 三角不等式
- 常被用来度量某个向量空间(或矩阵)中的每个向量的长度或大小。
- 在泛函分析中,它定义在赋范线性空间中,并满足一定的条件,即
-
0范数/1范数/2范数/p范数/核范数/
- torch.dist(input, other, p=2)计算p范数
- torch.norm()计算2范数 p=0,就是0范数,p=1,就是1范数,p=2,就是2范数
a = torch.rand(2, 1)
b = torch.rand(2, 1)
print(a, b)
print(torch.dist(a, b, p = 1))
print(torch.dist(a, b, p = 2))
print(torch.dist(a, b, p = 3))
print(torch.norm(a))
print(torch.norm(a, p=3))
print(torch.norm(a, p='fro'))
运行结果:
tensor([[0.5695],
[0.4388]]) tensor([[0.6387],
[0.5247]])
tensor(0.1551)
tensor(0.1103)
tensor(0.0988)
tensor(0.7189)
tensor(0.6457)
tensor(0.7189)
-
为什么说通过范数的约束可以完成对模型参数的约束呢?
-
在模型优化中,有一个结构约束,当前的模型结构越简单越不容易过拟合,模型结构越简单,其中一个比较重要的点就是参数的个数少,或者说参数中0元素的个数多,参数就是向量或者矩阵,也就是Tensor,正则向就是关于参数的约束,通常就是使用范数约束
-
4.5 Tensor中的矩阵分解——PCA
-
常见的矩阵分解
- LU分解: 将矩阵A分解成L(下三角)矩阵和U(上三角)矩阵的乘积
- QR分解: 将原矩阵分解成正交矩阵Q和上三角矩阵R的乘积
- EVD分解: 特征值分解——PCA一种数据降维的方法
- SVD分解: 奇异值分解——LDA——判别分析
-
特征值分解
- 将矩阵分解为由其特征值和特征向量表示的矩阵之积的方法
- 特征值 VS 特征向量
-
PCA(主成分分析)与特征值分解
- PCA:将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有的n维特征的基础上重新构造出来的k维特征
- PCA算法的优化目标就是:
- 降维后同一维度的方差最大——特征越丰富
- 不同维度之间的相关性为0——冗余比较低
- 协方差矩阵
通过投影矩阵,将nXm的矩阵乘上kXn编程kXm的矩阵,将N维的矩阵降低到K维的矩阵,在后续进行计算的时候计算量会下降,通常在进行PCA的时候会舍弃一些信息,保留主要的信息,会使我们的信息变得更加的鲁棒,在进行相似性分析或者是分类的时候,特征的效果可能会更好
PCA是一个无监督的算法,不需要标签,标注成本比较低
-
4.6 Tensor中的矩阵分解——SVD分解-LDA
同类间距尽可能小,不同类间距尽可能大
- EVD分解 VS SVD分解
- 矩阵方阵且满秩(可对角化)
- 矩阵分解不等于特征降维度
- 协方差矩阵描述方差和相关性
- Pytorch中的奇异值分解
- torch.svd()