文章目录
线性代数
机器学习、深度学习的基础除了编程语言外,还有一个就是应用数学。它一般包括线性代数、概率与信息论、概率图、数值计算与最优化等。其中线性代数又是基础的基础。线性代数是数学的一个重要分支,广泛应用于科学和工程领域。大数据、人工智能的源数据在模型训练前,都需要转换为向量或矩阵,而这些运算正是线性代数的主要内容。
如在深度学习的图像处理中,如果1张图由28*28像素点构成,那这28*28就是一个矩阵。在深度学习的神经网络中,权重一般都是矩阵,我们经常把权重矩阵W与输入X相乘,输入X一般是向量,这就涉及矩阵与向量相乘的问题。诸如此类,向量或矩阵之间的运算在深度学习中非常普遍,也非常重要。
本章主要介绍如下内容:
- 自动求解线性方程组
- 标量、向量、矩阵和张量
- 矩阵和向量运算
- 特殊矩阵与向量
- 特征值分解
- 奇异值分解
- 迹运算
- 实例
第1章 线性代数基础
1.1自动求解线性方程组
假设有如下线性方程组:
这个线性方程组,如果用高中知识,手工很快能求得结果。如何用Python实现该方程组的自动求解呢?要实现Python求解,先要解决哪些问题?
要用Python处理这个问题,首先,需要用Python的方式表示这个方程组。
用矩阵、向量的方式表示这个线性方程组,如图2-1所示:
图2-1 用矩阵表示方程组
要使用Python实现式(2.1)的求解,首先需要把式(2.1)用矩阵和向量的方式表示,然后利用相关线性代数相关知识进行求解。具体步骤如下:
1)用矩阵、向量表示式(2.1)或图2-1中关系。
假设系数矩阵为A,变量构成的向量为X,右边的值构成的向量为B,则他们之间的关系,可用下式表示:
AX=B (2.2)
其中A与X是点积(dot)的关系。
2)用NumPy表示矩阵、向量。
1 2 |
A=np.array([[1,1,1],[0,2,5],[2,5,-1]]) B=np.array([6,-4,27]) |
3) 因行列式|A|≠0(可计算:np.linalg.det(A) ≠0),由此可知,矩阵A可逆,
即存在A的可逆矩阵,使得(单位矩阵),对式(2.2)两边同时乘以矩阵 ,可得:
即
由此可得:
4)求线性方程组的解
A的逆矩阵(用A1表示)可表示为:
1 |
A1=np.linalg.inv(A) |
所以
1 |
X=np.dot(A1,B) |
可得线性方程组的解为:
array([ 5., 3., -2.])
1.2标量、向量、矩阵和张量
在机器学习、深度学习中,首先遇到的就是数据,如果按类别来划分,我们通常会遇到以下4种类型的数据。
1.2.1 标量(scalar)
一个标量就是一个单独的数,一般用小写的变量名称表示,如a,x等。
1.2.2 向量(vector)
向量就是一列数或一个一维数组,这些数是有序排列的。通过次序中的索引,我们可以确定向量中每个单独的数。通常我们赋予向量粗体的小写变量名称,如x、y等。一个向量一般有很多元素,这些元素如何表示?我们一般通过带脚标的斜体表示,如表示向量x中的第一个元素,表示第二元素,依次类推。向量元素的个数称为向量的维数。
当需要明确表示向量中的元素时,我们一般将元素排列成一个方括号包围的一行,如下式:
X称为行向量。
X也可表示为列向量:
我们可以把向量看作空间中的点,每个元素是不同的坐标轴上的坐标。
向量可以这样表示,那我们如何用编程语言如python来实现呢?如何表示一个向量?如何获取向量中每个元素呢?请看如下实例:
1 2 3 4 5 |
import numpy as np a=np.array([1,2,4,3,8]) print(a.size) print(a[0],a[1],a[2],a[-1]) |
打印结果如下:
5
1 2 4 8
这说明向量元素个数为5,向量中索引一般从0开始,如a[0]表示第一个元素1,a[1]
表示第二个元素2,a[2]表示第三个元素4,依次类推。这是从左到右的排列顺序,如果从右到左,我们可用负数来表示,如a[-1]表示第1个元素(注:从右到左),a[-2]表示第2个元素,依次类推。
1.2.3 矩阵(matrix)
矩阵是二维数组,其中的每一个元素被两个索引而非一个所确定。我们通常会赋予矩阵粗体的大写变量名称,比如A。如果一个实数矩阵高度为m,宽度为n,那么我们说。
与向量类似,可以通过给定行和列的下标表示矩阵中元素,下标用逗号分隔,如表示A左上的元素,表示第一行第二列对应的元素,依次类推;这是表示单个元素,如果我们想表示1列或1行,该如何表示呢?我们可以引入冒号":"来表示,如第1行,可用A1,:表示,第2行,用A2,:表示,第1列用A:,1表示,第n列用A:,n表示。
如何用Python来表示或创建矩阵呢?如果希望获取其中某个元素,该如何实现呢?请看如下实例:
1 2 3 4 5 6 7 8 |
import numpy as np A=np.array([[1,2,3],[4,5,6]]) print(A) print(A.size) #显示矩阵元素总个数 print(A.shape) #显示矩阵现状,即行行和列数。 print(A[0,0],A[0,1],A[1,1]) print(A[1,:]) #打印矩阵第2行 |
打印结果:
[[1 2 3]
[4 5 6]]
6
(2, 3)
1 2 5
[4 5 6]
矩阵可以用嵌套向量生成,和向量一样,在Numpy中,矩阵元素的下标索引也是从0开始的。
1.2.4张量(tensor)
几何代数中定义的张量是向量和矩阵的推广或更通用的称呼,我们可以将标量视为零阶张量,向量视为一阶张量,那么矩阵就是二阶张量,三阶的就称为三阶张量,以此类推。在机器学习、深度学习中经常遇到多维矩阵,如一张彩色图片就是一个三阶张量,三个维度分别是图片的高度、宽度和色彩数据。
张量(tensor)也是深度学习框架TensorFlow、PyTorch的重要概念。TensorFlow由tensor(张量)+flow(流)构成。
同样我们可以用Python来生成张量及获取其中某个元素或部分元素,请看实例:
1 2 3 4 5 6 |
B=np.arange(16).reshape((2, 2, 4)) #生成一个3阶矩阵 print(B) print(B.size) #显示矩阵元素总数 print(B.shape) #显示矩阵的维度 print(B[0,0,0],B[0,0,1],B[0,1,1]) print(B[0,1,:]) |
打印结果如下:
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
16
(2, 2, 4)
0 1 5
[4 5 6 7]