矩阵的基础这里不赘述
补充:范数
范数(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
相同的张量对象。这意味着 A
和 B
都指向同一个内存地址上的张量,它们共享相同的数据值和形状。这种操作称为引用赋值或浅拷贝。
降维
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即计算欧几里得范数