机器学习(三) | 线性代数

本文介绍了线性代数中的范数概念,包括L1、L2和无穷范数,以及它们在机器学习中的应用,如正则化和SVM。同时涵盖了张量在PyTorch中的操作,如生成张量、形状操作和不同类型的矩阵乘法,以及点积和范数的计算方法。
摘要由CSDN通过智能技术生成

矩阵的基础这里不赘述

补充:范数

范数(norm)是线性代数中的一个概念,用来度量向量的大小或长度。在数学上,向量的范数是一个函数,满足以下性质:

1. 非负性:对于任意向量 x,范数的值始终大于等于 0,且只有当向量为零向量时,范数为零。

2. 齐次性:对于任意标量 α,以及向量 x,范数满足 ||αx|| = |α| ||x||。

3. 三角不等式:对于任意两个向量 x 和 y,有 ||x + y|| ≤ ||x|| + ||y||。

常见的范数有:

1. L1 范数(曼哈顿距离):||x||₁ = Σ|xᵢ|,表示向量中所有元素的绝对值之和。

2. L2 范数(欧几里得距离):||x||₂ = √(Σxᵢ²),表示向量各个元素的平方和再开方。

3. 无穷范数:||x||₊ = max(|x₁|, |x₂|, ..., |xₙ|),表示向量中绝对值最大的元素。

范数在机器学习和优化问题中有广泛的应用,例如在正则化、支持向量机(SVM)、梯度下降等算法中。

对称和反对称矩阵、正定矩阵、正交矩阵、置换矩阵

特征向量和特征值:Ax=λx

特征向量(x):不被矩阵改变方向的向量

特征值(λ)

代码

张量

x.torch.arange(5,9)#生成一个[5,6,7,8]的张量

张量的长度len(x)#在PyTorch中,len() 函数返回张量 x 的第一个维度的长度。如果 x 是一个一维张量,则返回它的长度。如果 x 是一个多维张量,则返回它的第一个维度的长度。不能使用x.len()

张量的形状x.shape

import torch

# 创建一个张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 获取张量形状
print(x.shape)  # 输出:torch.Size([2, 3])

torch.arange(20).reshape(5,4)#注意此处20必须等于5*4也就是前面一个参数不能是除20以外的其他数

脑洞大开:如果需要前17个数是0-16而后面的数是0的一个5*4的张量要如何做?

Answer:

import torch

# 创建一个形状为 5x4 的零张量
A = torch.zeros(5, 4)

# 将前 17 个数填充进去
A_flat = A.flatten()
A_flat[:17] = torch.arange(17)

# 将扁平化的向量重塑为 5x4
A = A_flat.reshape(5, 4)

# 打印张量
print(A)
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [12., 13., 14., 15.],
        [16.,  0.,  0.,  0.]])

A.T#矩阵的转置

A.clone()#将A的一个副本分配给B

注意:不能 B = A 原因是当执行 B = A 时,实际上是将 B 指向了与 A 相同的张量对象。这意味着 AB 都指向同一个内存地址上的张量,它们共享相同的数据值和形状。这种操作称为引用赋值浅拷贝

降维

A.sum()#会沿所有轴降低张量的维度使它变为一个标量

A.sum(axis=0)#指定沿哪个轴降低维度多个可用A.sum(axis=[0,1])

A.mean()#求平均值

A.sum() / A.numel()#也是求平均值其中A.numel()是返回张量中元素的总数

A.mean(axis=0), A.sum(axis=0) / A.shape[0]#同样也可以指定维度

非降维求和

有时在调用函数来计算综合或均值时保持轴数不变会很有用

对于A
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [12., 13., 14., 15.],
        [16., 17., 18., 19.]])
A_sum_axis1 = A.sum(axis=1)
tensor([ 6., 22., 38., 54., 70.])
sum_A = A.sum(axis=1, keepdims=True)
tensor([[ 6.],
        [22.],
        [38.],
        [54.],
        [70.]])

差别是显而易见的。

例如,由于sum_A在对每行进行求和后仍保持两个轴,我们可以(通过广播将A除以sum_A)。

A / sum_A
tensor([[0.0000, 0.1667, 0.3333, 0.5000],
        [0.1818, 0.2273, 0.2727, 0.3182],
        [0.2105, 0.2368, 0.2632, 0.2895],
        [0.2222, 0.2407, 0.2593, 0.2778],
        [0.2286, 0.2429, 0.2571, 0.2714]])

这样就计算出了每个元素对于按列求和的数的权重,即每个元素在这一行的权重。

如果我们想沿[某个轴计算A元素的累积总和], 比如axis=0(按行计算),可以调用cumsum函数。 此函数不会沿任何轴降低输入张量的维度。

A.cumsum(axis=0)
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  6.,  8., 10.],
        [12., 15., 18., 21.],
        [24., 28., 32., 36.],
        [40., 45., 50., 55.]])
对比A:
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [12., 13., 14., 15.],
        [16., 17., 18., 19.]])

可知其将某位置的元素改为了将同列的以上所有行求和的值。

点积

点积是相同位置的元素的和

可以直接调用点积函数dot()

torch.dot(x, y)

也可以使用按元素相乘求和

torch.sum(x * y)

矩阵-向量积

torch.mv(A, x)

矩阵-矩阵积

torch.mm()

任意维度的张量积

torch.matmul()

范数

计算L2范数

u = torch.tensor([3.0, -4.0])
torch.norm(u)

计算L1范数

torch.abs(u).sum()

lp_norm = torch.norm(x, p=2)

可以用torch.norm()计算,其中第二个参数p缺省时默认为2即计算欧几里得范数

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值