[paddle] 矩阵乘法
矩阵乘法
矩阵乘法是线性代数中的一个基本运算。假设我们有两个矩阵 A \mathbf{A} A 和 B \mathbf{B} B,矩阵 A \mathbf{A} A 的维度是 m × n m \times n m×n,矩阵 B \mathbf{B} B 的维度是 n × p n \times p n×p,那么矩阵 A \mathbf{A} A 和 B \mathbf{B} B 的乘积 C \mathbf{C} C 将是一个 m × p m \times p m×p 维度的矩阵。
矩阵乘法的数学定义如下:
矩阵 C \mathbf{C} C 的每个元素 c i j c_{ij} cij 是由矩阵 A \mathbf{A} A 的第 i i i 行和矩阵 B \mathbf{B} B 的第 j j j 列对应元素相乘后再相加得到的,即:
c i j = a i 1 b 1 j + a i 2 b 2 j + ⋯ + a i n b n j c_{ij} = a_{i1}b_{1j} + a_{i2}b_{2j} + \cdots + a_{in}b_{nj} cij=ai1b1j+ai2b2j+⋯+ainbnj
其中, 1 ≤ i ≤ m 1 \leq i \leq m 1≤i≤m, 1 ≤ j ≤ p 1 \leq j \leq p 1≤j≤p。
具体来说,假设矩阵 A \mathbf{A} A 如下:
A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ) \mathbf{A} = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{pmatrix} A=⎝⎜⎜⎜⎛a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎠⎟⎟⎟⎞
矩阵 B \mathbf{B} B 如下:
B = ( b 11 b 12 ⋯ b 1 p b 21 b 22 ⋯ b 2 p ⋮ ⋮ ⋱ ⋮ b n 1 b n 2 ⋯ b n p ) \mathbf{B} = \begin{pmatrix} b_{11} & b_{12} & \cdots & b_{1p} \\ b_{21} & b_{22} & \cdots & b_{2p} \\ \vdots & \vdots & \ddots & \vdots \\ b_{n1} & b_{n2} & \cdots & b_{np} \end{pmatrix} B=⎝⎜⎜⎜⎛b11b21⋮bn1b12b22⋮bn2⋯⋯⋱⋯b1pb2p⋮bnp⎠⎟⎟⎟⎞
那么矩阵
C
\mathbf{C}
C 的每个元素
c
i
j
c_{ij}
cij 按照上述公式计算。
需要注意的是,矩阵乘法不满足交换律,即一般来说,
A
B
≠
B
A
\mathbf{A}\mathbf{B} \neq \mathbf{B}\mathbf{A}
AB=BA。但是,矩阵乘法满足结合律和分配律。
结合律:
A
(
B
C
)
=
(
A
B
)
C
\mathbf{A}(\mathbf{B}\mathbf{C}) = (\mathbf{A}\mathbf{B})\mathbf{C}
A(BC)=(AB)C
分配律:
A
(
B
+
C
)
=
A
B
+
A
C
\mathbf{A}(\mathbf{B} + \mathbf{C}) = \mathbf{A}\mathbf{B} + \mathbf{A}\mathbf{C}
A(B+C)=AB+AC 和
(
A
+
B
)
C
=
A
C
+
B
C
(\mathbf{A} + \mathbf{B})\mathbf{C} = \mathbf{A}\mathbf{C} + \mathbf{B}\mathbf{C}
(A+B)C=AC+BC
转置律:
(
A
B
)
⊤
=
B
⊤
A
⊤
(\mathbf{AB})^\top=\mathbf{B}^\top \mathbf{A}^\top
(AB)⊤=B⊤A⊤
paddle.linalg.multi_dot(x)
参数
- x ([tensor]):输入的是一个 tensor 列表。
import paddle
# A * B
A = paddle.rand([3, 4])
B = paddle.rand([4, 5])
out = paddle.linalg.multi_dot([A, B])
print(out.shape)
# A * B * C
A = paddle.rand([10, 5])
B = paddle.rand([5, 8])
C = paddle.rand([8, 7])
out = paddle.linalg.multi_dot([A, B, C])
print(out.shape)
方阵的幂
paddle.linalg.matrix_power(x, n)
- x 二维张量方阵
- n 幂次, 同一个方阵相乘 n n n 次, 例如3次 A 3 = A A A \mathbf{A}^3=\mathbf{A}\mathbf{A}\mathbf{A} A3=AAA.
import paddle
x = paddle.to_tensor([[1, 2, 3],
[1, 4, 9],
[1, 8, 27]], dtype='float64')
print(paddle.linalg.matrix_power(x, 2))
print(paddle.linalg.matrix_power(x, 0))
print(paddle.linalg.matrix_power(x, -2))
方阵的逆
paddle.linalg.inv(x)
- x 方阵
数学定义, 如果给定方阵
A
\mathbf{A}
A, 存在
B
\mathbf{B}
B, 满足
A
B
=
B
A
=
I
\mathbf{A}\mathbf{B}=\mathbf{B}\mathbf{A}=\mathbf{I}
AB=BA=I
I
\mathbf{I}
I 是单位矩阵, 则称
B
\mathbf{B}
B 是
A
\mathbf{A}
A 的逆,记作
A
−
1
\mathbf{A}^{-1}
A−1. 称
A
\mathbf{A}
A 是可逆矩阵
import paddle
mat = paddle.to_tensor([[2, 0], [0, 2]], dtype='float32')
inv = paddle.inverse(mat)
print(inv)
矩阵的伪逆
也称作 moore-penrose 逆, 对于一个矩阵 A \mathbf{A} A(不一定是方阵),其伪逆 A + \mathbf{A}^+ A+ 是满足以下四个条件的矩阵:
- A A + A = A \mathbf{A}\mathbf{A}^+\mathbf{A} = \mathbf{A} AA+A=A
- A + A A + = A + \mathbf{A}^+\mathbf{A}\mathbf{A}^+ = \mathbf{A}^+ A+AA+=A+
- ( A A + ) ∗ = A A + (\mathbf{A}\mathbf{A}^+)^* = \mathbf{A}\mathbf{A}^+ (AA+)∗=AA+
- ( A + A ) ∗ = A + A (\mathbf{A}^+\mathbf{A})^* = \mathbf{A}^+\mathbf{A} (A+A)∗=A+A
paddle.linalg.pinv(x, rcond=1e-15, hermitian=False, name=None)
- x (Tensor):输入变量,类型为 Tensor,数据类型为 float32、float64、complex64、complex12,形状为(M, N)或(B, M, N)。
- rcond (float64,可选):奇异值(特征值)被截断的阈值,奇异值(特征值)小于 rcond * 最大奇异值时会被置为 0,默认值为 1e-15。
- hermitian (bool,可选):是否为 hermitian 矩阵或者实对称矩阵,默认值为 False。
矩阵的指数函数
给定矩阵
A
\mathbf{A}
A, 按照指数函数的泰勒公式
exp
(
x
)
=
∑
k
=
0
∞
1
n
!
x
n
\exp(x)=\sum_{k=0}^\infty \frac{1}{n!}x^n
exp(x)=∑k=0∞n!1xn, 把矩阵
A
\mathbf{A}
A 带入
x
x
x 的位置得到矩阵值函数,
exp
(
A
)
=
∑
k
=
0
∞
1
n
!
A
n
\exp(\mathbf{A})=\sum_{k=0}^\infty \frac{1}{n!}A^n
exp(A)=k=0∑∞n!1An
paddle.linalg.matrix_exp(x, name=None)
import paddle
mat_a = paddle.empty((2, 2, 2))
mat_a[0, :, :] = paddle.eye(2, 2)
mat_a[1, :, :] = 2 * paddle.eye(2, 2)
print(mat_a)
out = paddle.linalg.matrix_exp(mat_a)
print(out)
import math
mat_a = paddle.to_tensor([[0, math.pi/3], [-math.pi/3, 0]])
out = paddle.linalg.matrix_exp(mat_a)
print(out)