矩阵运算用于描述许多机器学习算法。
一些操作可以直接用于求解关键方程,而另一些则为描述和使用更复杂的矩阵操作提供了有用的简写或基础。
在本教程中,您将了解机器学习方法描述中使用的重要线性代数矩阵运算。
完成本教程后,您将了解:
- 用于翻转矩阵维度的转置运算。
- 用于求解线性方程组的逆运算。
- 用于其他矩阵运算中的简写表示的迹和行列式运算。
使用我的新书《机器学习的线性代数》启动您的项目,其中包括分步教程和所有示例的Python源代码文件。
让我们开始吧。

机器学习中矩阵运算的温和介绍
图片由Andrej提供,保留部分权利。
教程概述
本教程分为5个部分,它们是:
- 转置
- 求逆
- 迹
- 行列式
- 秩
在机器学习线性代数方面需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
转置
已定义的矩阵可以被转置,从而创建一个行和列翻转的新矩阵。
这由矩阵旁边的上标“T”表示。
1 |
C = A^T |
可以从矩阵的左上角到右下角画一条无形的对角线,矩阵可以沿着这条对角线翻转以得到转置。
1 2 3 4 5 6 |
a11, a12 A = (a21, a22) a31, a32 a11, a21, a31 A^T = (a12, a22, a32) |
如果矩阵是对称的,即具有相同的列数和行数,并且在无形对角线的两侧相同位置具有相同的值,则该操作没有影响。
A^T 的列是 A 的行。
— 第 109 页,《线性代数导论》,第五版,2016。
我们可以在 NumPy 中通过调用 T 属性来转置矩阵。
1 2 3 4 5 6 |
# 转置矩阵 from numpy import array A = 数组([[1, 2], [3, 4], [5, 6]]) print(A) C = A.T print(C) |
运行示例首先打印定义的矩阵,然后打印转置后的版本。
1 2 3 4 5 6 |
[[1 2] [3 4] [5 6]] [[1 3 5] [2 4 6]] |
转置操作提供了一种简短的表示法,用作许多矩阵操作中的一个元素。
求逆
矩阵求逆是一个过程,它找到另一个矩阵,当与该矩阵相乘时,结果是一个单位矩阵。
给定矩阵 A,找到矩阵 B,使得 AB 或 BA = In。
1 |
AB = BA = In |
矩阵求逆操作用矩阵旁边的-1上标表示;例如,A^-1。操作的结果被称为原始矩阵的逆;例如,B 是 A 的逆。
1 |
B = A^-1 |
如果存在另一个导致单位矩阵的矩阵,则该矩阵是可逆的,并非所有矩阵都可逆。不可逆的方阵称为奇异矩阵。
A 所做的,A^-1 都会撤销。
— 第 83 页,《线性代数导论》,第五版,2016。
矩阵求逆操作不是直接计算的,而是通过数值操作发现逆矩阵,其中可以使用一系列高效的方法,通常涉及矩阵分解形式。
然而,A^−1 主要用作理论工具,在大多数软件应用中不应在实践中使用。
— 第 37 页,《深度学习》,2016。
可以使用 inv() 函数在 NumPy 中对矩阵求逆。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 矩阵求逆 from numpy import array from numpy.linalg import inv # 定义矩阵 A = 数组([[1.0, 2.0], [3.0, 4.0]]) print(A) # 矩阵求逆 B = inv(A) print(B) # 乘以 A 和 B I = A.dot(B) print(I) |
首先,我们定义一个小的 2x2 矩阵,然后计算该矩阵的逆,然后通过将其与原始矩阵相乘得到单位矩阵来确认逆。
运行示例会打印原始矩阵、逆矩阵和单位矩阵。
1 2 3 4 5 6 7 8 |
[[ 1. 2.] [ 3. 4.]] [[-2. 1. ] [ 1.5 -0.5]] [[ 1.00000000e+00 0.00000000e+00] [ 8.88178420e-16 1.00000000e+00]] |
矩阵求逆用作解决以矩阵方程形式表示的方程组中的操作,其中我们有兴趣找到未知数向量。一个很好的例子是在线性回归中找到系数值的向量。
迹
方阵的迹是矩阵主对角线(从左上到右下)上值的和。
迹运算符给出矩阵所有对角线元素的总和
— 第 46 页,《深度学习》,2016。
在方阵上计算迹的操作使用符号“tr(A)”描述,其中 A 是正在执行操作的方阵。
1 |
tr(A) |
迹计算为对角线值的和;例如,在 3x3 矩阵的情况下
1 |
tr(A) = a11 + a22 + a33 |
或者,使用数组表示法
1 |
tr(A) = A[0,0] + A[1,1] + A[2,2] |
我们可以在 NumPy 中使用 trace() 函数计算矩阵的迹。
1 2 3 4 5 6 7 |
# 迹 from numpy import array 从 numpy 导入 trace A = 数组([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(A) B = trace(A) print(B) |
首先,创建一个 3x3 矩阵,然后计算其迹。
运行示例,首先打印数组,然后打印迹。
1 2 3 4 5 |
[[1 2 3] [4 5 6] [7 8 9]] 15 |
迹运算本身并不有趣,但它提供了更简单的表示法,并作为其他关键矩阵运算中的一个元素。
行列式
方阵的行列式是矩阵体积的标量表示。
行列式描述了构成矩阵行的向量的相对几何形状。更具体地说,矩阵 A 的行列式告诉您由 A 的行给出的盒子的体积。
— 第 119 页,《线性代数无废话指南》,2017
它用“det(A)”符号或|A|表示,其中 A 是我们正在计算行列式的矩阵。
1 |
det(A) |
方阵的行列式是从矩阵的元素计算出来的。更确切地说,行列式是矩阵所有特征值的乘积。
行列式的直观理解是,它描述了当一个矩阵与另一个矩阵相乘时,它将如何缩放另一个矩阵。例如,行列式为 1 会保留另一个矩阵的空间。行列式为 0 表示该矩阵不可逆。
方阵的行列式是一个单独的数字。[…] 它立即告诉我们矩阵是否可逆。当矩阵没有逆时,行列式为零。
— 第 247 页,《线性代数导论》,第五版,2016。
在 NumPy 中,可以使用 det() 函数计算矩阵的行列式。
1 2 3 4 5 6 7 |
# 迹 from numpy import array 从 numpy.linalg 导入 det A = 数组([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(A) B = det(A) print(B) |
首先,定义一个 3x3 矩阵,然后计算该矩阵的行列式。
运行示例首先打印定义的矩阵,然后打印矩阵的行列式。
1 2 3 4 5 |
[[1 2 3] [4 5 6] [7 8 9]] -9.51619735393e-16 |
与迹运算一样,行列式运算本身并不有趣,但它提供了更简单的表示法,并用作其他关键矩阵运算中的一个元素。
矩阵秩
矩阵的秩是矩阵中线性独立行或列数的估计。
矩阵 M 的秩通常表示为函数 rank()。
1 |
rank(A) |
对秩的直观理解是将其视为矩阵中所有向量所跨越的维度数。例如,秩为 0 表示所有向量跨越一个点,秩为 1 表示所有向量跨越一条线,秩为 2 表示所有向量跨越一个二维平面。
秩是数值估计的,通常使用矩阵分解方法。一种常见的方法是使用奇异值分解 (SVD)。
NumPy 提供了 matrix_rank() 函数用于计算数组的秩。它使用 SVD 方法来估计秩。
下面的示例演示了计算具有标量值和另一个所有零值的向量的矩阵的秩。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 向量秩 from numpy import array 从 numpy.linalg 导入 matrix_rank # 秩 v1 = 数组([1,2,3]) print(v1) vr1 = matrix_rank(v1) print(vr1) # 零秩 v2 = 数组([0,0,0,0,0]) print(v2) vr2 = matrix_rank(v2) print(vr2) |
运行示例会打印第一个向量及其秩为 1,然后是第二个零向量及其秩为 0。
1 2 3 4 5 6 7 |
[1 2 3] 1 [0 0 0 0 0] 0 |
下一个示例明确表明秩不是矩阵的维度数,而是线性独立方向的数量。
提供了三个 2x2 矩阵的示例,演示了秩为 0、1 和 2 的矩阵。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 矩阵秩 from numpy import array 从 numpy.linalg 导入 matrix_rank # 秩 0 M0 = 数组([[0,0],[0,0]]) print(M0) mr0 = matrix_rank(M0) print(mr0) # 秩 1 M1 = 数组([[1,2],[1,2]]) print(M1) mr1 = matrix_rank(M1) print(mr1) # 秩 2 M2 = 数组([[1,2],3,4]]) print(M2) mr2 = matrix_rank(M2) print(mr2) |
运行示例首先打印一个 0 2x2 矩阵,然后是秩,然后是一个秩为 1 的 2x2 矩阵,最后是一个秩为 2 的 2x2 矩阵。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[[0 0] [0 0]] 0 [[1 2] [1 2]] 1 [[1 2] [3 4]] 2 |
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 使用您自己的数据,为每个操作创建5个示例。
- 手动实现每个矩阵操作,用于定义为列表的列表的矩阵。
- 搜索机器学习论文,并找到每个操作被使用的一个例子。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 第 3.4 节 行列式。《线性代数无废话指南》,2017。
- 第 3.5 节 矩阵逆。《线性代数无废话指南》,2017。
- 第 5.1 节 行列式的性质,《线性代数导论》,第五版,2016。
- 第 2.3 节 单位矩阵和逆矩阵,《深度学习》,2016。
- 第 2.11 节 行列式,《深度学习》,2016。
- 第 3.D 节 可逆性和同构向量空间,《线性代数简明教程》,第三版,2015。
- 第 10.A 节 迹,《线性代数简明教程》,第三版,2015。
- 第 10.B 节 行列式,《线性代数简明教程》,第三版,2015。
API
- numpy.ndarray.T API
- numpy.linalg.inv() API
- numpy.trace() API
- numpy.linalg.det() API
- numpy.linalg.matrix_rank() API
文章
总结
在本教程中,您学习了机器学习方法描述中使用的重要线性代数矩阵操作。
具体来说,你学到了:
- 用于翻转矩阵维度的转置运算。
- 用于求解线性方程组的逆运算。
- 用于其他矩阵运算中的简写表示的迹和行列式运算。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
精彩的概述,谢谢!
谢谢。
感谢这篇非常有价值的教程!
呃,小问题,第一个例子有错别字吗?
A.T 不应该是
数组([[11, 21, 31],
[12, 22, 32]])
而不是你(目前)有的,即
数组([[11, 21, 23],
[12, 22, 22]])
谢谢,已修复!
[[ 1 -2 0 4]
[ 3 1 1 0]
[ -1 -5 -1 8]
[ 3 8 2 -12]]
秩 = 2
非常好!
解释得很好
谢谢!
有帮助
谢谢。
非常感谢您的资源,谢谢!
感谢您的反馈,Aurora!