矩阵最重要的性质——空间变换

由特征列的取值范围所有构成的矩阵空间应具有完整性,即能够反映事物的空间形式或变化规律。



 向量张成空间

        n维正交空间的性质:在零维空间中没有长度也没有方向,因此没有量的概念,也没有运算规则,我们形象地称其为原点;扩展到一维空间,点的运算规则是标量的运算规则;再扩展到平面直角坐标系,x轴和y轴也是两个向量,长度可以无限延伸,它们之间在方向上相互正交,定位其上的点需要考虑它与原点和坐标轴x、y之间的关系,因此是一个二维向量,例如:直角坐标系中向量的长度可以通过它与原点的欧氏距离得到,方向可以通过它与坐标轴的夹角余弦得到;再推而广之,n维直角坐标系的每个坐标轴都是向量,长度可以无限延伸,它们两两之间在方向上相互正交,定位其上的点需要考虑它与原点和每个坐标轴的关系,因此是一个n维向量。

        得出的重要结论:向量的长度和方向都是相对于其他向量的量,长度相对于原点,方向相对于坐标轴。想要构成一个二维的空间(注意,不一定是正交空间),就必须有两个或两个以上存在交点(原点)的向量(或其延长线)。从线性代数的角度说,构成空间的两个向量之间必须线性无关,也就是说这两个维度必须与它们构成的矩阵的秩相等,而这两个向量就称为这个空间的基或基底。基底是向量空间的一组很“结实”的向量集合,每一个基就像房梁和立柱一样支撑起整个空间大厦,并衍生出空间内的全部向量。

        我们给一个向量空间找一个基底(注意,这里的基底指的是空间坐标系,基底向量指的是其中的坐标轴),本质上就是为了给这个空间定一个坐标系(注意,不一定是正交),以方便定位和计算向量。基底就成为坐标系在线性空间中的推广。基底向量对应坐标系的坐标轴,有几个基底向量就有几个坐标轴,n维空间的一个基底就需要有n个基底向量。不难看出,所谓n维正交空间,是由n个彼此正交的基底向量构成的空间。

        由基底构成的空间内部的任何向量都可以由其基底来线性表示,也就是说,基底构成的空间内部的任何向量都可以通过基底数乘和加法来得到。



向量与矩阵的乘法

        所谓向量与矩阵的乘法就是一个向量从一个线性空间(坐标系),通过选取一个新的基底([a1, a2]构成的新坐标系),变换到这个新基底构成的另一个线性空间的过程。

        需要特别指出的是,一个向量的线性变换在几何上表现为缩放和旋转两个动作,以及这两个动作的组合——拉伸、压缩等。这些动作的一个共性就是都要通过原点。



矩阵乘法

        我们已经可以把一个向量变换到另一个空间中,我们现在想把一组向量都变换到另一个空间中,这就需要通过矩阵乘法来计算,当然也就是矩阵乘法的意义。

为什么乘法公式要使左边矩阵的列数等于右边矩阵的行数呢?

        左边的矩阵被定义为一个向量组,其列数被认为向量的维度;右边的矩阵被定义为一个线性空间,相乘运算就是将这个向量组线性变换到新的线性空间中。也就是说,右边的矩阵的行数最少要满足是由基底向量构成的线性空间的维度,或方程组的秩。这样就保证了这个变换必然存在。



线性变换——特征值与特征向量

我们知道,矩阵乘法对应了一个变换,它可以把一个向量变成另一个方向或长度都不同的新向量。在这个变换的过程中,原向量主要发生旋转、伸缩等变化。但是线性变换的规则要求这个变换必须通过由基底向量构成的坐标系原点。简单来说,以平面直角坐标系为例,这种变换不过就是沿着通过原点的某条直线的缩放和旋转。

这种变换必然导致有这样一组向量存在,即被变换的线性空间内的某个向量或向量组只发生了伸缩变换,而没有产生旋转的效果,也就是说在线性变换下,在它们所在的直线上保持不变。那么这些向量就称为这个矩阵的特征向量,伸缩的比例就是特征值。

这里如果特征值变为负值,即特征向量旋转180°,也可看作方向不变,而伸缩比为负值。所以特征向量也叫线性不变量。特征向量的不变性使他们变成与其自身共线的向量。特征向量在线性变换后可能伸长或缩短,或反向伸长或反向缩短,甚至变成零向量(特征值为零时),但与它变换后的向量应在同一条直线上。

矩阵的特征向量和特征值:

        

空间权重矩阵 空间距离_特征向量

这里A是原矩阵,v是特征向量,空间权重矩阵 空间距离_python_02是特征值。

求解特征值和特征向量程序实现:

import numpy as np
A = [[8, 1, 6],
     [3, 5, 7],
     [4, 9, 5]]
evals, evecs = np.linalg.eig(A)
print("特征值:", evals)
print("特征向量:", evecs)

结果为:

特征值: [ 16.10937116   4.98888476  -3.09825592]
特征向量: [[ 0.54007649  0.85121607 -0.36703212]
 [ 0.54821084 -0.37786845 -0.52675118]
 [ 0.63857831 -0.36420687  0.7666946 ]]

Process finished with exit code 0

有了特征值和特征向量还可以还原出原矩阵:

        

空间权重矩阵 空间距离_人工智能_03

A是原矩阵,Q是特征向量,∑是特征值构成的对角矩阵。

sigma = evals*np.eye(3)
a = np.dot(np.dot(evecs, sigma), np.linalg.inv(evecs))
print(a)

结果为:

[[ 8.  1.  6.]
 [ 3.  5.  7.]
 [ 4.  9.  5.]]

Process finished with exit code 0

这里要注意一点,numpy中的np.dot(), np.matmul()实现的是矩阵的乘法,而np.multiply()和*实现的是矩阵的点积,即对应位置元素相乘。

最后再根据两张图解释一下特征值和特征向量与原矩阵的关系:

空间权重矩阵 空间距离_特征值_04

空间权重矩阵 空间距离_特征值_05

 

参考:

1.机器学习算法原理与编程实践/郑捷著. 北京:电子工业出版社,2015.11