[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 列表。
python 复制代码
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.
python 复制代码
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 是可逆矩阵

python 复制代码
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)

python 复制代码
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)
相关推荐
梦醒沉醉25 分钟前
Python教程(四)——数据结构
python
Adolf_199329 分钟前
django的权限角色管理(RBAC)
数据库·python·django
終不似少年遊*32 分钟前
MindSpore框架学习项目-ResNet药物分类-模型优化
人工智能·深度学习·机器学习·计算机视觉·分类·数据挖掘·华为云
weixin_3077791338 分钟前
使用FastAPI和Apache Flink构建跨环境数据管道
redis·python·云计算·fastapi·aws
Code_流苏1 小时前
《Python星球日记》 第55天:迁移学习与预训练模型
python·深度学习·微调·resnet·迁移学习·预训练模型·超参数优化
Humbunklung2 小时前
PySide6 GUI 学习笔记——常用类及控件使用方法(常用类字体QFont)
笔记·python·学习·pyqt
Blossom.1182 小时前
《从零开始:构建你的第一个区块链应用》
人工智能·驱动开发·python·深度学习·区块链·aigc·交互
蹦蹦跳跳真可爱5892 小时前
Python----神经网络(基于AlexNet的猫狗分类项目)
人工智能·pytorch·python·深度学习·神经网络·分类
绝顶大聪明2 小时前
[模型选择与调优]机器学习-part4
人工智能·深度学习·机器学习
伊织code3 小时前
PyTorch API 8 - 工具集、onnx、option、复数、DDP、量化、分布式 RPC、NeMo
pytorch·python·ai·api·-·8