线性代数|预备知识|动手学深度学习

227 阅读1分钟

1. 证明一个矩阵 A\mathbf{A} 的转置的转置是 A\mathbf{A},即 (A)=A(\mathbf{A}^\top)^\top = \mathbf{A}

1. 矩阵转置的定义:

AAm×nm×n 矩阵,则其转置 AA^\topn×mn×m 矩阵,且元素满足:

(A)ij=Aji(A^\top)_{ij}​=A_{ji}

其中,(i,j)(i,j) 表示矩阵的行索引和列索引。

2. 矩阵转置的转置公式推导:

根据矩阵转置的定义,我们可以得到:

((A))ij=(A)ji((A^\top)^\top)_{ij} = (A^\top)_{ji}

进一步展开,得到:

((A))ij=Aij((A^\top)^\top)_{ij} = A_{ij}

2. 给出两个矩阵 A\mathbf{A}B\mathbf{B},证明 “它们转置的和” 等于 “它们和的转置”,即 A+B=(A+B)\mathbf{A}^\top + \mathbf{B}^\top = (\mathbf{A} + \mathbf{B})^\top

1. 矩阵转置的定义:

AAm×nm×n 矩阵,则其转置 AA^\topn×mn×m 矩阵,且元素满足:

(A)ij=Aji(A^\top)_{ij} = A_{ji}

其中,(i,j)(i,j) 表示矩阵的行索引和列索引。

2. 矩阵转置的和等于它们的和的转置公式推导:

根据矩阵转置的定义,我们可以得到:

(A+B)ij=(A)ij+(B)ij=Aji+Bji=(A+B)ji=(A+B)ij\begin{align*} & (A^\top + B^\top)_{ij} \\ & = (A^\top)_{ij} + (B^\top)_{ij} \\ & = A_{ji} + B_{ji} \\ & = (A+B)_{ji} \\ & = (A+B)^\top_{ij} \end{align*}

3. 给定任意方阵 A\mathbf{A}A+A\mathbf{A} + \mathbf{A}^\top 总是对称的吗?为什么?

(A+A)ij=Aij+Aij=Aij+Aji=Aji+Aji=(A+A)ji\begin{align*} & (A + A^\top)_{ij} \\ & = A_{ij} + A^\top_{ij} \\ & = A_{ij} + A_{ji} \\ & = A^\top_{ji} + A_{ji} \\ & = (A^\top + A)_{ji} \end{align*}

(A+A)ij=(A+A)ji(A + A^\top)_{ij} = (A + A^\top)_{ji}

A+AA + A^\top 对称

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

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

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

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

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

dash_line = '=' * 20

# 本节中定义了形状的张量 X。len(X) 的输出结果是什么?
# 对于任意形状的张量X, len(X) 是否总是对应于X特定轴的长度?这个轴是什么?
X = torch.ones(24).reshape(2, 3, 4)
display(X, len(X))

# 运行 A/A.sum(axis=1),看看会发生什么。请分析一下原因?
A = torch.arange(20).reshape(5, 4)
# A_sum = A.sum(axis=1)
A_sum = A.sum(axis=1, keepdim=True)
print(dash_line)
display(A, A_sum, A_sum.shape, A_sum.T.shape)
display(A / A_sum)

# 考虑一个具有形状的张量,在轴 0、1、2 上的求和输出是什么形状?
print(dash_line)
display(X.shape, X.sum(axis=0).shape, X.sum(axis=1).shape, X.sum(axis=2).shape)

# 为 linalg.norm 函数提供 3 个或更多轴的张量,并观察其输出。对于任意形状的张量这个函数计算得到什么?
print(dash_line)
display(torch.linalg.norm(X), X.pow(2).sum().sqrt())
tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])
         
2

====================

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])
        
tensor([[ 6],
        [22],
        [38],
        [54],
        [70]])
        
torch.Size([5, 1])

torch.Size([1, 5])

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]])
        
====================

torch.Size([2, 3, 4])

torch.Size([3, 4])

torch.Size([2, 4])

torch.Size([2, 3])

====================

tensor(4.8990)

tensor(4.8990)