[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)
相关推荐
HyperAI超神经3 分钟前
在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA
人工智能·深度学习·yolo·目标检测·机器学习·物体检测·姿态估计
可爱的鸡仔29 分钟前
深度学习系列--04.梯度下降以及其他优化器
人工智能·pytorch·python·深度学习
蹦蹦跳跳真可爱5891 小时前
Python----Python高级(并发编程:进程Process,多进程,进程间通信,进程同步,进程池)
开发语言·python
m0_dawn1 小时前
(算法竞赛)图论+DFS深搜——图的dfs遍历1
python·算法·蓝桥杯·深度优先·图论
智识世界Intelligence1 小时前
LLM的Deep Research功能:重构人类认知与创新的新范式
经验分享·机器学习·自然语言处理·知识图谱·学习方法
m0_748245342 小时前
SQL Server的安装和简单使用
后端·python·flask
fertiland2 小时前
深入浅出 DeepSeek-R1 如何用强化学习提升 LLM 的推理能力
人工智能·深度学习·机器学习
郑同学zxc2 小时前
机器学习9-卷积和卷积核2
人工智能·机器学习
m0_748236832 小时前
Python毕业设计选题:基于django+vue的智能租房系统的设计与实现
python·django·课程设计
羑悻的小杀马特2 小时前
DeepSeek 引发 AI 大模型战火,编程语言群雄激战谁夺胜利权杖?
java·c++·人工智能·python·rust·deepseek