关键词:线性代数 / 矩阵 / 基本定义
作者:郭俊麟 | 清华伯克利 数据科学
人工智能作为近10年最火的学科之一,背后却有着三大基础学科支持着他的发展,分别是线性代数,微积分,还有概率论,对于各式各样的经典算法,无一例外的都用到了矩阵来承载来自不同维度的数据,而许多人的一大烦恼就是知道原理却无从下手代码的实践,显然一大原因是对实现算法的编程语言或者函数库不够熟悉,以下小编将从 Python 编程语言的角度来从头回顾线性代数的基本专有名词,揭开人工智能算法的最原始面纱。
矩阵基本定义
本节主要介绍不同矩阵名称背后的定义,并直接使用代码来计算我们希望看到的结果。
在 python 代码中的numpy模块几乎可以说是数值计算的唯一选择。
import numpy as np
A = np.random.randint(0, 10, 72)
A = A.reshape(9, 8)
print(A)
输出:
[[5 4 5 8 5 7 0 7]
[5 6 4 0 9 8 6 5]
[1 2 9 6 7 7 3 5]
[3 4 7 8 4 6 9 2]
[4 8 1 3 5 4 8 4]
[5 1 5 7 3 9 9 8]
[0 8 4 1 6 9 3 2]
[4 3 0 3 6 4 5 9]
[2 8 6 3 5 5 3 4]]
主要的原因就在于不止提供调用的函数丰富之外,矩阵对应不同变量名的内存管理还被极大的优化,简而言之就是效率高,速度快,即便是对比与非常受欢迎的pandas库,其运行速度也是不同量级的存在。如果还没安装过numpy,可以使用下面指令在终端快速安装。
pip install numpy
1. 矩阵元素
中的
称为矩阵的元素,可以是数字,函数,实数,复数。东西用矩阵包起来的一大好处就是能实现批量处理,减少在脚本语言中循环计算的次数,进而提升代码运行速度,虽然还是不及C语言,但却已经能够和其他脚本语言拉开速度上的差距。
2. 列 (台) / 行 (内地) - row
矩阵中由上而下所计算出的数字,即
表示第一列 (台) / 行 (内地) 的元素。有趣的是两岸在描述矩阵行列的时候是反着来的,因此当台湾大学李宏毅老师讲课的时候需要内心自己转换一下索引的方向。
print(A[0])
输出:
[5, 4, 5, 8, 5, 7, 0, 7]
由于矩阵中仅为一列 (台) / 行 (内地),又可以称之为 列 (台) / 行 (内地) 向量 (row vector)。
3. 行 (台) / 列 (内地) - column
矩阵中由左而右所计算出的数字,即
表示第二行 (台) / 列 (内地) 的元素。
print(A[:, 1:2])
输出:
[[4],
[6],
[2],
[4],
[8],
[1],
[8],
[3],
[8]])
由于矩阵中仅为一行 (台) / 列 (内地),又可以称之为 行 (台) / 列 (内地)向量 (column vector)。
4. 矩阵阶数 - order
以 总列数x总行数 的方式表示,一般皆置于矩阵的右下角,例如
print(A.shape)
输出:
(9, 8)
5. 复数矩阵
矩阵中的函数如果有复数形式的值,则归类其为复数矩阵。
B = np.array([[1+1.j, 2-1.j],
[3-2.j, 4+5.j]])
print(B.dtype)
输出:
dtype('complex128')
6. 方阵
矩阵中的行列数相等时,该矩阵称为方阵,令 行数=n 时,则称该矩阵为 n 阶方阵。
C = np.random.randint(0, 10, 9)
C = reshape(3, 3)
print(C)
输出:
[[6 4 9]
[8 4 5]
[8 9 3]]
7. 子矩阵 - submatrix
在 n 阶方阵的前提下,取方阵中的元素构成低于 n 阶的矩阵。
print(C[0:2, 0:2])
输出:
[[6, 4],
[8, 4]]
print(C[::2, 0:2])
输出:
[[6, 4],
[8, 9]]
print(C[0:2, 0:])
输出:
[[6, 4, 9],
[8, 4, 5]]
print(C[0:, 0:2])
输出:
[[6, 4],
[8, 4],
[8, 9]]
print(C[2, 1])
输出:
9
8. 主子矩阵 - Principle submatrix
如果所取的子矩阵中对角元素恰为矩阵对角线元素,称该子矩阵为主子矩阵。
print(C[::2, ::2])
输出:
[[6, 9],
[8, 3]]
print(C[:2, :2])
输出:
[[6, 4],
[8, 4]]
print(C[1:3, 1:3])
输出:
[[4, 5],
[9, 3]]
9. 对角矩阵 - Diagonal matrix
在方阵的前提下,如果对角线上的元素不全为 0,而其他元素皆为 0 时,该矩阵为对角矩阵。
print(np.diag(C))
输出:
[6, 4, 3]
print(np.diag(np.diag(C)))
输出:
[[6, 0, 0],
[0, 4, 0],
[0, 0, 3]]
10. 单位矩阵 - Unit matrix / Identity matrix
在对角矩阵中,如果对角线上的元素皆为 1,则称之单位矩阵。
print(np.diag(np.ones(C.shape[0])))
输出:
[[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]]
这一个个简单的矩阵操作拆解开来都是直观的存在,而快速理解复杂操作的首要前提,恰巧正是对简单操作的熟练掌握,因此这些代码基本功格外重要!Github源代码github.com
转发、分享!微信公众号每周更新,同时每周腾讯会议在线免费分享! 关注公众号,点击按钮“AI大会”即可加入微信群(公布腾讯会议房间号),和清华师兄一起面对面讨论Ai。微信公众号