[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)
相关推荐
_深海凉_15 分钟前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦37 分钟前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu1 小时前
Python 语法之数据结构详细解析
python
AI问答工程师1 小时前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan5202 小时前
python对Excel数据处理(1)
python·excel·pandas
小饕2 小时前
我从零搭建 RAG 学到的 10 件事
python
春末的南方城市2 小时前
比肩顶尖闭源模型!京东开源240亿参数多模态模型JoyAI-Image:统一理解/生成/编辑,重塑AI图像编辑。
人工智能·深度学习·机器学习·计算机视觉·aigc
老歌老听老掉牙2 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
哥布林学者2 小时前
深度学习进阶(七)Data-efficient Image Transformer
机器学习·ai
做cv的小昊2 小时前
【TJU】应用统计学——第五周作业(3.1 假设检验的基本思想、3.2 单个正态总体参数的假设检验)
学习·线性代数·机器学习·数学建模·矩阵·概率论·tju