线性代数

我是这样记忆的。
背景知识

  • “列”是向量的默认方向;
  • 矩阵是向量的容器,二维矩阵的每列都可视为向量;

于是,0 维(dim=0)表示向量的每个元素所在方向,1 维(dim=1)表示矩阵的每个元素(即,向量)所在方向,以此类推

hw 1-3在论坛不太好表示,一种简单的证明方法是跟踪每个元素a_ij经过转置运算或者其它运算后的位置变化,或者在计算机中随机生成一个tensor以证明,正规的证明方式是借助辅助符号,改天补上(肚子好饿

# homework 4
x = torch.arange(24).reshape(2, 3, 4)
len(x)
# output is 2

# hw 5
x = torch.arange(24).reshape(4, 6)
len(x)
# 是的,经过样例,作业4和作业5我的试验,发现至少对于1,2,3维的tensor都是如此

# hw 6
A, A.sum(dim=1) # error: A/A.sum(dim=1) : The size of tensor a (4) must match the size of tensor b (5) at non-singleton dimension 1
# 根据报错信息,在维度1(从0开始),第二个tensor维度比第一个tensor的维度大(递增了),导致错误,第一个tensor是5*4的,第二个是1*5的,都是二维tensor,可能在这种情况下无法使用广播机制

# hw 7
x = torch.arange(24).reshape(2, 3, 4)
x, x.sum(dim=0).shape, x.sum(dim=0), x.sum(dim=1).shape, x.sum(dim=1), x.sum(dim=2).shape, x.sum(dim=2)
# dim 0: 3 * 4; dim 1: 2 * 4; dim 2: 2 * 3
# 理解:沿着哪个dim,就把这个dim方向上的数加在一起拍扁,并且维数也降了一维,可以画图理解

# hw 8
import numpy
numpy.linalg.norm(x), torch.sqrt(torch.sum(x * x))
# 对比发现,类似于二维矩阵的2-范数,这是tensor的2-范数

我的理解 axis=0 就是把最外层的看成一个向量,axis=1 级别的都设成一个变量 x
[x1,x2,…xn],
axis=1 就是把第二层数组内的元素看成一个变量
[
[x11, x12, …x1n],
[x21, x22, …x2n],
]
x可以是标量或者任意张量
以此类推

A/A.sum(axis=1)怎么才能广播,使其可以进行计算呢

交作业:
import torch

1.证明一个矩阵的转置的转置是原矩阵

A = torch.arange(20).reshape(5, 4)

print(“Original matrix A:”)

print(A)

print(“\nTranspose of A (A.T):”)

print(A.T)

print(“\nTranspose of the transpose of A (A.T.T):”)

print(A.T.T)

验证 A 是否等于 A.T.T

print(“\nIs A equal to A.T.T?”)

print(A == A.T.T)

2.给定两个矩阵A和B,证明“它们转置的和”等于“它们和的转置”

B = torch.tensor([[1, 5, 6, 7], [2, 3, 4, 8], [7, 6, 5, 4], [3, 2, 1, 0], [9, 8, 7, 6]])
print(A.T + B.T == (A + B).T)

3.给定任意方阵,总是对称的吗?为什么?

A = torch.arange(25).reshape(5, 5)

A = torch.arange(16).reshape(4, 4)

print(A + A.T)

4.本节中定义了形状(2, 3, 4)的张量X。len(X)的输出结果是什么?

X = torch.arange(24).reshape(2, 3, 4)

print(X,‘\n’,len(X)) #2

5.对于任意形状的张量X,len(X)是否总是对应于X特定轴的长度?这个轴是什么?

X = torch.arange(72).reshape(6, 3, 4)

print(X,‘\n’,len(X)) #它返回的是张量的第一个维度的大小,即6

6.运行A/A.sum(axis=1),看看会发生什么。请分析一下原因?

print(A,‘\n’,A.sum(axis=1),‘\n’,A/A.sum(axis=1))

发生了广播机制,A.sum(axis=1)的结果是一个形状为(5,)的向量,而A的每一行都与这个向量做了按元素相除运算

7.考虑一个具有形状(2, 3, 4)的张量,在轴0、1、2上的求和输出是什么形状?

print(X)
print(X.sum(axis=0),‘\n’,X.sum(axis=0).shape,‘\n’,X.sum(axis=1),‘\n’,X.sum(axis=1).shape,‘\n’,X.sum(axis=2),‘\n’,X.sum(axis=2).shape)

(3, 4) (2, 4) (2, 3)

8.为linalg.norm函数提供3个或更多轴的张量,并观察其输出。对于任意形状的张量这个函数计算得到什么?

X = X.float()

print(torch.linalg.norm(X))

创建一个具有形状 (2, 3, 4) 的张量

X = torch.arange(24).reshape(2, 3, 4).float()

X = torch.arange(120).reshape(2, 3, 5, 4).float()

打印张量 X

print(“Tensor X:”)

print(X)

计算并打印张量 X 的范数

norm_X = torch.linalg.norm(X)

print(“\nNorm of tensor X:”)

print(norm_X)

函数默认计算的是 Frobenius 范数,这与张量的轴数无关。

Frobenius 范数是所有元素的平方和的平方根。无论张量有多少个轴,计算方法都是一样的

若有错误,希望大家指正。

线性代数

我的是 A.mean()报错mean(): could not infer output dtype. Input dtype must be either a floating
好像现在 mean 只能处理 float 类型 or complex dtype,要改成 float 才能运行

axis=0表示按照行增大的方向来看,axis=1表示按照列增大的方向来看

axis已经过时了,应该用dim了吧,我运行的时候发现的,前者更多是Numpy后者更Pytorch一点

  1. 证明一个矩阵$\mathbf{A}$的转置的转置是$\mathbf{A}$,即$(\mathbf{A}^\top)^\top = \mathbf{A}$。
A = torch.arange(20).reshape(5,2,2)
A.mT.mT == A
  1. 给出两个矩阵$\mathbf{A}$和$\mathbf{B}$,证明“它们转置的和”等于“它们和的转置”,即$\mathbf{A}^\top + \mathbf{B}^\top = (\mathbf{A} + \mathbf{B})^\top$。
A = torch.arange(20).reshape(5,2,2)
B = torch.arange(20).reshape(5,2,2)
C = A.mT + B.mT
C == (A + B).mT
  1. 给定任意方阵$\mathbf{A}$,$\mathbf{A} + \mathbf{A}^\top$总是对称的吗?为什么?
(A + A.mT).mT == A.mT + A.mT.mT 
A.mT + A.mT.mT == A.mT + A
  1. 本节中定义了形状$(2,3,4)$的张量Xlen(X)的输出结果是什么?
z = torch.ones([2,3,4])
len(z)
  1. 对于任意形状的张量X,len(X)是否总是对应于X特定轴的长度?这个轴是什么?
第0轴
  1. 运行A/A.sum(axis=1),看看会发生什么。请分析一下原因?
A的shape为[5,4], A.sum(axis=1)的shape为[5], 无法使用广播机制
  1. 考虑一个具有形状$(2,3,4)$的张量,在轴0、1、2上的求和输出是什么形状?
#[3,4],[2,4],[2,3]
Z1 = torch.ones([2,3,4])
sumZ1_0 = Z1.sum(axis=0)
sumZ1_0.shape
sumZ1_1 = Z1.sum(axis=1)
sumZ1_1.shape
sumZ1_1 = Z1.sum(axis=2)
sumZ1_1.shape
  1. linalg.norm函数提供3个或更多轴的张量,并观察其输出。对于任意形状的张量这个函数计算得到什么?
A1 = torch.arange(48, dtype=torch.float32).reshape(2,4,2,3)
torch.linalg.norm(A1)
# norm可以指定求范数的维度,高维张量如果没有指定维度,也是直接拉平求L2范数