PyTorch——Tensor的介绍(四)统计学方法、分布函数、随机抽样、矩阵分解

880 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情


上一篇文章中,我们介绍pytorch中的in-place操作和广播机制、取整/取余运算、比较运算、三角函数和其他数学函数

今天,我们来介绍Tensor统计学相关的函数、分布函数、随机抽样、线性代数运算、矩阵分解——PCA、SVD分解——LDA。


  • 4.1 Tensor统计学相关的函数

1.png 2.png
  • 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估计器
      • 变分自动编码器的重新参数化技巧

3.png

  • 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

4.png 同类间距尽可能小,不同类间距尽可能大 6.png

7.png
  • EVD分解 VS SVD分解
    • 矩阵方阵且满秩(可对角化)
    • 矩阵分解不等于特征降维度
    • 协方差矩阵描述方差和相关性
  • Pytorch中的奇异值分解
    • torch.svd()

9JQ4ZCQY3M({Q$KEN%9BFQX.png