第02讲 向量的基础知识
作者:欧新宇(Xinyu OU)
本文档所展示的测试结果,均运行于:Intel Core i7-7700K CPU 4.2GHz
本章要点
1. 向量的基本知识回顾 2. 列向量及向量的Python描述 3. 向量的范数
4. 常用向量
空间是贯穿线性代数整个领域的主干和核心概念,我们所有的概念和应用都会构架在空间这个逻辑实体 上。而向量和矩阵就是我们用来填充这个实体的工具,包括运算、映射、降维、投影、近似求解、特征 提取等,都将建立在基于矩阵和向量的空间中实现。
1. 重温向量
向量:也称欧几里得向量、几何向量、矢量,它指具有大小和方向的量。它可以形象化地表示为 带箭头的线段。直观地说,一组排列成行或列的有序数字,就是向量。
箭头所指:代表向量的方向;
线段长度:代表向量的大小;
向量的记法:
印刷体,记作小写粗斜体字母,如 *a, b, u, v *;
手写体,在字母顶上加一小箭头 “→”,如 给定向量的起点A和终点B,可记作 ;
在空间直角坐标系中,以数对形式表示,如 (2, 3)
1.1 二维向量的空间表示
【例2.1】给定二维向量 𝒖= ,它有两个分量,其中x分量值为3,y 分量值为4,以原点(0,0)为起 点,可以在直角坐标系中构建一条有向线段。
1.2 三维向量的空间表示
【例2.2】 给定三维向量 𝒖= ,它有三个分量,其中x 分量值为4,y 分量值为2,z 分量值为2,以
原点(0,0,0)为起点,可以在三阶笛卡尔坐标系中构建一条有向线段。
2. 列向量及向量的Python描述
2.1 计算机领域主要使用列向量
根据数字的排列方式,向量可以被分为行向量和列向量。在计算机领域中,我们常使用列向量来表示 和处理向量。例如,将矩阵A映射到向量x上时,可以用 Ax 来表示,最常见的应用是求解方程组。列向 量通常由两种表示方法。
直观表示:
单行表示(更常用): ,
2.2 基于Python语言的向量表示
在Python中,最重要,也是最常用的一个库就是数学计算库 Numpy,它也是我们这门课中最主要 python工具包。下面我们将使用numpy库来实现矩阵的创建。
创建numpy数组(向量)
获取变量的数据类型 import numpy as np
A = np.array([1, 2, 3, 4]) print(A)
[1 2 3 4]
值得注意的是display() 函数是IPython的内置函数,仅适合用于Jupyter Notebook 和 JupyterLab。
IPython是python的交互式shell界面。
下面,我们还可以使用python的内置函数type实现对数据类型的查看 。
2.3 列向量的生成
前面我们已经提到在机器学习及大多数计算机的任务中,我们需要处理的都是以列形式存在的列向量,
而numpy默认生成的是一个行向量。因此,我们需要对生成的向量进行一定转换。具体而言,我们需要 将numpy生成的行向量转换成列向量。此处,最容易也是最直接的方法就是使用矩阵的转置
(transpose)。
值得注意的是,在计算机的存储意识中,向量是一个一维的量,它只在一个维度上具有值。因 此,无法进行转置(可理解为90度的方向转换,从行向量转换为列向量)。
幸运的是,我们可以将一维的向量理解成一个二维矩阵,只不过矩阵的某个维度值为1。
当我们使用向量来表示一个数据时,可以表示为: A = [a_1, a_2,…, a_n], 此时,A 是一个维度为 1,
长度为 的数据(向量);
而当我们使用矩阵来表示这个向量时,则可以表示为: = [a{11}, a{12},…,a_{1n}], 此时 是 一个维度为2的数据(矩阵),第一个维度长度为 1,第二个维度长度为 ,我们也可以将这样的 矩阵理解为一个行向量,一行n列,形态为: (1, 4)。
在转换为二维矩阵后,我们就可以通过矩阵的转置实现行向量向列向量的转换,此时的数据 将转变为一个列向量 ,n行一列,形态为: (4, 1) ,表示为: 。 在Python中,有两种很直接的行列转换方式,他们都可以实现矩阵的转置:A.transpose() 和 A.T。
(注意,我们前面介绍过,矩阵转置对于向量是无效的。)
- 直接使用一维向量进行转换
display(A)
array([1, 2, 3, 4])
type(A)
numpy.ndarray
import numpy as np
A = np.array([2, 2, 3, 4]) B = A.transpose()
C = A.T
print('a={}'.format(A)) print('A={}'.format(B)) print('B={}'.format(C))
- 使用二维矩阵进行转换
【结果分析】
从上面 “直接使用一维向量进行转换” 的结果来看,原始的一维向量A和经过 .transpose()和 .T 转换 后的向量B和C,都呈现为相同的形态 (4, 1),并且值也完全相同。这说明在Python中,转置在向量上是 无效的。
当我们使用二维矩阵进行转换时,新生成的矩阵 是一个 的二维矩阵,当经过 .transpose() 和 .T 转换后,两个矩阵都变成了 的矩阵。这说明,原来以二维矩阵显示的行向量,形态为 (1,4);已经转换为以二维矩阵显示的列向量了,形态为(4, 1)。
a=[2 2 3 4]
A=[2 2 3 4]
B=[2 2 3 4]
print('A的形态: {}'.format(A.shape))
print('B的形态: {}; C的形态: {}'.format(B.shape, C.shape))
A的形态: (4,)
B的形态: (4,); C的形态: (4,)
import numpy as np
A2 = np.array([[1, 2, 3, 4]]) B2 = A2.transpose()
C2 = A2.T
print('A2={}'.format(A2)) print('B2={}'.format(B2)) print('C2={}'.format(C2))
A2=[[1 2 3 4]]
B2=[[1]
[2]
[3]
[4]]
C2=[[1]
[2]
[3]
[4]]
print('A2的形态: {}'.format(A2.shape))
print('B2的形态: {}; C2的形态: {}'.format(B2.shape, C2.shape))
A2的形态: (1, 4)
B2的形态: (4, 1); C2的形态: (4, 1)
值得注意的是,在Python中一维向量和二维矩阵的表示非常容易转换,只需要增加一层中括号“[
]”就可以实现从一维到二维的转换。相似地,三维矩阵使用三层中括号表示,n 维矩阵使用 n 层 中括号表示。下面给出一维向量和二维向量的表示。
3. 向量的范数
3.1 范数的定义
范数(norm):数学中的一种基本概念。在线性代数、泛函分析及相关的数学领域,范数是一个具有 长 度 概念的函数。在泛函分析中,它定义在赋范线性空间中,并满足一定的条件,即: ①非负性;②齐次 性;③三角不等式。
范数常常被用来度量向量空间(或矩阵)中的某个向量的长度或大小。例如,在二维的欧氏几何空间R 中,元素被刻画成一个从原点出发的带有箭头的有向线段,每一个矢量的有向线段的长度即为该矢量的 欧氏范数。
对于一个 维向量 ,其大小可以用向量 的范数来进行衡量,其一般形式可以表示 为 :
其中, 且 。
值得注意的是,符号 也被称为 𝒑-范数(p-norm)。
3.2 范数的典型性质
范数直观上可以表示为衡量向量长度的函数,相当于求原点o到点𝑣的距离,因此所有的范数都满足以下 三条性质:
非负性:函数的值永远都是非负,当且仅当向量为全零向量时,范数函数值为0.
其中, 是任意向量, 是 的范数。
三角不等式:两个向量范数的和大于等于两个向量和的范数。
正值齐次性:
3.3 常见范数
3.3.1 L2范数
L2范数的定义
对于 -范数,当 等于2时, 范数(L2范数, L2 norm)也被称为欧几里得范数,它表示从源点出发到 向量𝑣的欧几里得距离,简称欧式距离。向量𝑣的欧式距离通常可以表示为 ,也可以省略为: , 即:
在二维空间中,向量𝑣(𝑥, 𝑦) 的长度可以表示为:
A = np.array([1, 2, 3, 4]) A2 = np.array([[1, 2, 3, 4]])
向量间的距离
对于空间中的任意两个向量,也可以利用L2范数来求它们之间的距离。
【例2.3】 求向量 和向量 之间的距离 。
L2范数在机器学习和深度学习中被广泛应用,在具体的应用中,我们可以用两个向量的欧式距离来表达 它们之间的相似性。此外,还可以使用L2范数来对样本的特征或权重进行约束。
例如,公式 ,给出了岭回归算法(一种使用L2正则化的线性模型)的典 型形式。
如上例所示,为了方便计算,经常会使用平方L2范数来替代L2范数,省去开平方操作。
向量间的点积
两个向量的点积〖 𝑥〗^𝑇 𝑦可以用范数来表示,具体如下:
3.3.2 L1范数
当 等于1时,𝒑-范数就会退化成另外一种常用的特殊范数L1范数(L1范数, L1 norm)。其数学表达 为:
不难看出,它是对向量中的每个元素的绝对值的累加。因此,L1范数可以用来区分零元素和非零元素。
在机器学习和深度学习中,区分零和非零是非常重要,因此它也可以实现对样本特征或权重的约束。
例如,公式 ,,给出了套索(Lasso)回归算法(一种使用L1正则化的线性 模型)的典型形式。
3.3.3 无穷范数
当 趋近于 时, -范数就会变为机器学习中经常出现的另外一种范数: 范数,又称为无穷范数或最 大范数(max norm)。 范数表示向量中最大分量的绝对值:
在数据处理中,有时需要选择出响应最大的分量来进行处理。此时,就可以使用无穷范数。在深度学习 中的卷积神经网络CNN模型中的最大池化(max-pooling)就是这种思想最典型的应用。
3.3.4 F-范数
弗罗贝尼乌斯范数(Frobenius范数):简称为F范数,是一种定义在矩阵上的范数,用于衡量矩阵的大 小。F范数表示矩阵中各元素的平方和开方,其数学表达为:
F范数的计算规则与L2范数非常相似,区别是它是定义在矩阵上的范数,用于衡量矩阵的大小。
3.4 范数的Python描述
L2范数:
L1范数:
无穷范数:
F范数:
4. 常用的向量
全0向量和全1向量
全0向量:所有分量都为0的向量,用一个粗体的0表示。
全1向量:所有分量都为1的向量,用一个粗体的1表示。
全0向量和全1向量,通常都是为了保证表达式描述的正确性或为变量进行初始化使用。
One-hot向量
One-Hot向量:又称为独热码(独热编码),有且仅有一个分量为1,其它分量都为0的向量。其形式 如下:
One-Hot向量在编码中使用广泛,例如,在分类应用中,对于一个有8个类别的场景,通常将分类结果 编码为一个One-Hot向量,元素为1的那个分量对应的类别即为真实(预测)的分类类别。
One-Hot属于一种稀疏编码,不同分量之间默认没有关联。并且不同分量间通常是独立同分布(IID)
的。
单位向量
np.linalg.norm(x) # 默认状态为L2范数 np.linalg.norm(x, ord=2)
np.linalg.norm(x, ord=1)
np.linalg.norm(x, ord=np.inf)
np.linalg.norm(X) # 当X为矩阵时,即为F范数
单位向量(Unit Vector):L2范数为1的向量。
单位向量将向量的长度约束为1,这样很好地屏蔽了模长带来的影响,使向量只用于表达方向一种量。
例如常用的余弦相似性(cosine similarity)就通过比较两个向量的夹角大小来确定向量间的相似性。
其中, 为两个向量的夹角, 和 为两个单位向量。