
线性代数与向量标量与向量如何衡量一个人的健康程度在医学上我们可以根据一个人的 身高、体重、年龄 来大致推算其健康程度。如果转换成数学语言的话我们可以考虑写出这样一个公式其中x表示身高y表示体重z表示年龄(xy)/z公式的计算结果表示一个人的健康程度。公式中的x、y、z可以是任何数字我们将其称之为标量多个标量组合在一起产生了一个新的含义一个人的健康程度我们将这个组合称为向量。在代码中我们可以使用一维数组来表示一个向量importtorch xtorch.tensor([0,1,2,3])print(x)# tensor([0, 1, 2, 3])一个只有一个元素的一维数组可以表示一个标量importtorch xtorch.tensor([1])print(x)# tensor([1])矩阵在使用数据的过程中我们不可能只用一组数据一个向量例如医院必须要很多人的身体数据才能衡量出整体的健康指标。当我们将多个向量组合在一起时就形成了一个二维数组称之为矩阵importtorch xtorch.arange(12).reshape(3,-1)print(x)# tensor([[ 0, 1, 2, 3],# [ 4, 5, 6, 7],# [ 8, 9, 10, 11]])如果我们将矩阵中的元素沿着斜对称轴互换的话也就是将XijX_{ij}Xij变成XjiX_{ji}Xji,就可以得到数组的转置数学表示为XTX^TXTimporttorch xtorch.arange(12).reshape(3,-1)print(x)# tensor([[ 0, 1, 2, 3],# [ 4, 5, 6, 7],# [ 8, 9, 10, 11]])yx.Tprint(y)# tensor([[ 0, 4, 8],# [ 1, 5, 9],# [ 2, 6, 10],# [ 3, 7, 11]])如果XXTXX^TXXT,我们称其为对称矩阵importtorch xtorch.tensor([[1,2,3],[2,0,4],[3,4,5]])print(x)# tensor([[1, 2, 3],# [2, 0, 4],# [3, 4, 5]])yx.Tprint(y)# tensor([[1, 2, 3],# [2, 0, 4],# [3, 4, 5]])print(xy)# tensor([[True, True, True],# [True, True, True],# [True, True, True]])当我们对一个矩阵二维数组或者更高维数组进行求和时可以单独对某一维进行求和importtorch xtorch.ones(3,4)print(x)# tensor([[1., 1., 1., 1.],# [1., 1., 1., 1.],# [1., 1., 1., 1.]])print(x.sum())# tensor(12.)print(x.sum(axis0))# tensor([3., 3., 3., 3.])print(x.sum(axis1))# tensor([4., 4., 4.])axis0表示对第0维进行求和对于一个矩阵二维数组来说也就是将矩阵的高进行压缩变成了一个一维数组向量。同理我们对一个矩阵二维数组或者更高维数组进行求平均值时可以单独对某一维进行求平均值importtorch xtorch.arange(12,dtypefloat).reshape(3,-1)print(x)# tensor([[1., 1., 1., 1.],# [1., 1., 1., 1.],# [1., 1., 1., 1.]])print(x.mean())# tensor(12.)print(x.mean(axis0))# tensor([3., 3., 3., 3.])不过在某些操作中我们可能不想降低数组的维度importtorch xtorch.ones(3,4)print(x)# tensor([[1., 1., 1., 1.],# [1., 1., 1., 1.],# [1., 1., 1., 1.]])print(x.sum())# tensor(12.)# 得到的依旧是一个二维数组只不过第1维的数组长度为0print(x.sum(axis0,keepdimTrue))# tensor([[3., 3., 3., 3.]])此外还有个函数cumsum可以在某个维度上进行累计求和importtorch xtorch.ones(3,4)print(x)# tensor([[1., 1., 1., 1.],# [1., 1., 1., 1.],# [1., 1., 1., 1.]])print(x.sum())# tensor(12.)print(x.cumsum(axis1))# tensor([[1., 2., 3., 4.],# [1., 2., 3., 4.],# [1., 2., 3., 4.]])向量点积对于两个相同形状的向量将对应位置元素相乘然后取和可以得到这两个向量的点积数学表示为XTYX^TYXTY或者X,YX,YX,Y:importtorch xtorch.tensor([1,1,1])ytorch.tensor([2,2,2])print(torch.dot(x,y))# tensor(6)矩阵-向量积矩阵-向量积可以理解为向量点积的扩展将向量与矩阵的每行向量进行点积再将每个结果组合成一个向量就得到了矩阵-向量积importtorch xtorch.tensor([[1,1,1],[1,1,1],[1,1,1]])ytorch.tensor([2,2,2])# 用函数 mv 来得到矩阵-向量积print(torch.mv(x,y))# tensor([6, 6, 6])foriinrange(len(x)):print(torch.dot(y,x[i]))# tensor(6)# tensor(6)# tensor(6)矩阵乘法矩阵乘法也可以理解为向量点积的扩展只需将一个矩阵的第i行与另一个矩阵的第j列进行向量点积就可以得到结果矩阵的第i行j列的元素importtorch xtorch.tensor([[1,1,1],[1,1,1],[1,1,1]])ytorch.tensor([[2,2,2],[2,2,2],[2,2,2]])# 用函数 mm 来得到矩阵乘法的结果print(torch.mm(x,y))# tensor([[6, 6, 6],# [6, 6, 6],# [6, 6, 6]])范数我们将一个向量的大小称为向量的范数。范数有多种计算方式。L2L_2L2范数的计算方式是将向量中所有元素的平方求和然后求平方根∥x∥2∑i1nxi2\|\mathbf{x}\|_2 \sqrt{\sum_{i1}^n x_i^2}∥x∥2∑i1nxi2,在PyTorch中可以通过norm函数获得importtorch xtorch.tensor([3.0,-4.0])print(x.norm())# tensor(5.)L1L_1L1范数的计算方式是将向量中的所有元素的绝对值求和∥x∥1∑i1n∣xi∣\|\mathbf{x}\|_1 \sum_{i1}^n \left|x_i \right|∥x∥1∑i1n∣xi∣在PyTorch中可以通过这种方式获得importtorch xtorch.tensor([3.0,-4.0])print(torch.abs(x).sum())# tensor(7.)范数的意义在于我们可以衡量两个向量之间的差距importtorch xtorch.tensor([2.,3.,2.])ytorch.tensor([1.,1.,1.])print(x.norm())# tensor(4.1231)print(y.norm())# tensor(1.7321)print((x-y).norm())# tensor(2.4495)