点积将两个等长向量转换为一个标量,外积则将两个向量组合成一个矩阵。外积计算两个向量所有分量之间的两两乘积,可以表示特征交互、构造秩一矩阵,也可以用于组织二阶统计信息。
在 Python 中,可以使用嵌套循环或列表推导式实现外积,也可以使用 NumPy 的 np.outer()。对于批量向量,还可以通过增加轴和广播,一次计算多组对应向量的外积。
一、什么是外积
1、外积的基本定义
外积(Outer Product)将两个向量转换为一个矩阵。
设两个实数列向量分别为:
将 b 转置为行向量后,a 与 b 的外积写为:
其结果是一个 m × n 矩阵:
矩阵中第 i 行、第 j 列的元素为:
外积会将 a 中的每个分量分别与 b 中的所有分量相乘。
2、外积的形状
如果:
那么:
外积不要求两个向量具有相同维数。
例如,一个三维向量与一个二维向量进行外积,会得到一个 3 × 2 矩阵。
对于两个一维 NumPy 数组,形状关系为:
(m,) 与 (n,) → (m, n)
3、手工计算示例
设:
将 b 转置为行向量:
因此:
结果包含 3 行、2 列。第一个向量的维数决定行数,第二个向量的维数决定列数。
二、外积与其他向量运算
1、外积与点积
对于两个同维列向量 a、b ∈ ℝⁿ,点积可以写为:
点积将对应分量相乘后求和,结果是标量。
对于 a ∈ ℝᵐ、b ∈ ℝⁿ,外积为:
外积不会对两两乘积求和,结果是矩阵。
二者的核心区别是:
点积计算对应分量的乘积并求和;
外积计算所有分量组合的乘积。
2、外积与逐元素乘法
逐元素乘法要求两个向量形状相同:
它只计算对应位置的乘积,结果仍是向量。
外积计算所有位置组合的乘积,结果是矩阵。例如,两个三维向量进行逐元素乘法得到 3 个结果,进行外积则得到包含 9 个元素的 3 × 3 矩阵。
3、外积与叉积
外积有时会与叉积(Cross Product)混淆。
在常见的三维欧几里得空间中,叉积作用于两个三维向量,结果是一个垂直于二者的新向量;外积可以作用于不同维数的向量,结果是矩阵。
因此:
外积:向量与向量生成矩阵;
叉积:三维向量与三维向量生成向量。
三、外积矩阵的结构
外积生成的矩阵具有特殊结构。由于矩阵中的每一行和每一列都来自同一个向量的缩放,因此外积矩阵只包含一个独立方向的信息。
1、每一行都是同一行向量的缩放
设:
矩阵 M 的第 i 行为:
因此,每一行都是 bᵀ 的一个标量倍数。
对于前面的示例:
三行分别为:
可以看出,不同行之间只是缩放关系,并没有产生新的行方向。
2、每一列都是同一列向量的缩放
矩阵 M 的第 j 列为:
因此,每一列都是 a 的一个标量倍数。
前面矩阵的两列分别为:
外积矩阵的所有行都沿着同一个行方向,所有列也都沿着同一个列方向。
3、外积生成秩一矩阵
矩阵的秩(Rank)表示矩阵中相互独立的行或列的数量,可以用来描述矩阵包含的独立方向。
如果 a 和 b 都不是零向量,则:
这种矩阵称为秩一矩阵(Rank-One Matrix)。
这是因为外积矩阵中的每一行都是同一个向量 bᵀ 的倍数,每一列都是同一个向量 a 的倍数,因此不存在额外的独立方向。
如果任意一个向量是零向量,则:
此时结果是零矩阵,其秩为 0。
矩阵秩的完整定义和计算方法将在后续“矩阵秩与独立信息”中进一步讨论。
4、秩一矩阵如何作用于向量
设:
则:
其中:
表示向量 b 与 x 的点积,结果是一个标量。
因此:
这个过程可以理解为:
先计算输入向量 x 与方向 b 的点积,得到一个缩放系数;
再使用该系数缩放向量 a。
因此,秩一矩阵作用后的结果始终位于向量 a 张成的一维空间中。
四、外积的基本性质
设 a、u ∈ ℝᵐ,b、v ∈ ℝⁿ,c、d ∈ ℝ。
1、交换顺序会得到转置矩阵
交换两个向量的顺序后,结果矩阵的行列结构会互换:
如果 a 是 m 维向量、b 是 n 维向量,那么 a bᵀ 的形状为 m × n,b aᵀ 的形状为 n × m。
因此,外积通常不具有交换性。
2、对向量加法满足分配律
对第一个向量满足:
对第二个向量也满足:
3、标量可以合并
两个向量分别缩放后再计算外积,相当于用两个缩放系数的乘积缩放原外积矩阵。
4、向量与自身的外积
向量 a 与自身的外积为:
它是对称矩阵:
它还是半正定矩阵。对于任意同维向量 x:
例如:
则:
其对角线元素是各分量的平方,非对角线元素是不同分量之间的乘积。
五、使用 Python 基本语法计算外积
1、使用嵌套循环
可以使用两个循环遍历两个向量中的所有分量:
print(outer_product)输出:
[[8, 10], [-4, -5], [12, 15]]外层循环依次选择 a 中的分量,内层循环将当前分量与 b 中的所有分量相乘,从而生成矩阵的一行。
2、使用列表推导式
相同的计算也可以使用嵌套列表推导式完成:
print(outer_product)输出:
[[8, 10], [-4, -5], [12, 15]]外层推导式生成矩阵的各行,内层推导式生成当前行中的各个元素。
六、使用 NumPy 计算外积
1、使用 np.outer()
NumPy 可以使用 np.outer() 直接计算两个一维数组的外积:
print(result.shape)输出:
(3, 2)np.outer(a, b) 会将 a 中的每个元素与 b 中的每个元素相乘,结果形状为:(len(a), len(b))。
需要注意,np.outer() 会先将输入展平。因此,它适合计算两个一维数组的外积;对于多维数组,应先确认展平是否符合计算目的。
2、使用增加轴与广播
外积也可以通过增加长度为 1 的轴实现:
print(result.shape)输出:
(3, 2)其中:
a[:, np.newaxis] 将形状 (3,) 转换为 (3, 1);
b[np.newaxis, :] 将形状 (2,) 转换为 (1, 2);
两个数组逐元素相乘时,通过广播得到形状 (3, 2)。
广播关系为:
(3, 1) 与 (1, 2) → (3, 2)
这种写法明确保留了两个向量对应的轴,也便于扩展到批量外积。
3、使用 np.multiply.outer()
NumPy 还提供 np.multiply.outer():
result = np.multiply.outer(a, b)对于两个一维数组,它与 np.outer(a, b) 得到相同结果。
np.multiply.outer() 不会像 np.outer() 那样先将输入展平,而是保留输入数组原有的轴。若 A 的形状为 (p, q),B 的形状为 (r, s),则结果形状为 (p, q, r, s)。
对于普通一维向量,使用 np.outer() 更直观;需要保留多维数组原有轴时,可以使用 np.multiply.outer()。
七、批量计算多个外积
在数据处理中,经常需要为多组对应向量分别计算外积。
设数组 A 中的每一行是一个 m 维向量,数组 B 中的每一行是一个 n 维向量,并且两者包含相同数量的样本:
print(B.shape)输出:
(2, 3)可以通过增加轴计算每一对对应向量的外积:
print(batch_outer.shape)输出:
(2, 2, 3)其中:
第 0 个矩阵是 A[0] 与 B[0] 的外积;
第 1 个矩阵是 A[1] 与 B[1] 的外积。
增加轴后的形状关系为:
(batch, m, 1) 与 (batch, 1, n) → (batch, m, n)
这种方法只计算相同样本位置上的两组向量,不会在不同样本之间交叉组合。
八、外积在 AI 编程中的应用
1、构造两组特征之间的交互
设两组特征分别为:
它们的外积为:
这个矩阵包含两组特征之间所有可能的两两乘积,可用于表示不同特征之间的交互关系。
在多模态特征融合、双线性模型和二阶特征处理中,外积可以将两个向量之间的组合信息显式展开。
外积生成的矩阵规模可能较大,因此实际计算中常配合压缩、矩阵分解或低秩近似使用。
2、构造二阶特征矩阵
一个向量与自身的外积:
包含各分量的平方以及不同分量之间的乘积。
例如:
则:
这类矩阵可以表示单个样本内部各特征之间的二阶关系。
在统计分析中,中心化样本向量与自身的外积还是构造协方差矩阵的基本组成部分。
3、进行秩一矩阵更新
外积可以直接构造秩一矩阵,因此常用于对已有矩阵进行秩一更新:
其中:
M 是原矩阵;
a 和 b 决定更新的列方向和行方向;
η 控制更新幅度。
多个外积之和可以形成秩不超过 r 的矩阵:
更准确地说:
因此,外积既可用于秩一更新,也可作为构造低秩矩阵的基本单元。矩阵秩、分解与低秩近似将在后续文章中系统讨论。
九、常见问题及使用建议
1、不要使用 * 直接代替外积
对于两个形状相同的一维 NumPy 数组:
a * b表示逐元素乘法,不是外积。
计算外积可以使用:
np.outer(a, b)也可以增加轴后通过广播计算:
a[:, np.newaxis] * b[np.newaxis, :]2、注意外积的顺序
交换两个向量的顺序,会交换结果矩阵的行列结构:
编写代码前,应先确定哪个向量对应结果的行,哪个向量对应结果的列。
3、注意 np.outer() 会展平输入
如果将二维或更高维数组直接传入 np.outer(),NumPy 会先将它们展平,再计算外积。
因此,批量外积不应直接使用:
np.outer(A, B)应通过增加轴和广播等方法明确保留样本维度。
4、零向量会生成零矩阵
如果任意一个向量是零向量,外积结果就是零矩阵,其秩为 0,而不是秩一矩阵。
5、外积可能快速增加数据规模
m 维向量与 n 维向量的外积包含 m × n 个元素。
例如,两个长度均为 10000 的向量进行外积,会生成包含一亿个元素的矩阵。若数据类型为 64 位浮点数,仅数组数据通常就需要约 800 MB 内存。
在高维应用中,应根据计算目的考虑低秩表示、分块计算或隐式计算,避免不必要地构造完整外积矩阵。
小结
外积计算两个向量所有分量之间的两两乘积,并生成矩阵。非零向量的外积构成秩一矩阵,其所有列沿同一方向、所有行也沿同一方向。Python 可以使用嵌套循环、np.outer() 或增加轴与广播计算外积,并扩展到特征交互、二阶信息表示和低秩更新。
![]()
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.