图像处理之基础---矩阵和特征向量的 几何意义
长时间以来一直不了解矩阵的特征值和特征向量到底有何意义(估计很多兄弟有同样感受)。知道它的数学公式,但却找不出它的几何含义,教科书里没有真正地把这一概念从各种角度实例化地进行讲解,只是一天到晚地列公式玩理论——有个屁用啊。
根据特征向量数学公式定义,矩阵乘以一个向量的结果仍是同维数的一个向量,因此,矩阵乘法对应了一个变换,把一个向量变成同维数的另一个向量,那么变换的效果是什么呢?这当然与方阵的构造有密切关系,比如可以取适当的二维方阵,使得这个变换的效果就是将平面上的二维向量逆时针旋转30度,这时我们可以问一个问题,有没有向量在这个变换下不改变方向呢?可以想一下,除了零向量,没有其他向量可以在平面上旋转30度而不改变方向的,所以这个变换对应的矩阵(或者说这个变换自身)没有特征向量(注意:特征向量不能是零向量),所以一个特定的变换特征向量是这样一种向量,它经过这种特定的变换后保持方向不变,只是进行长度上的伸缩而已(再想想特征向量的原始定义Ax=cx, cx是方阵A对向量x进行变换后的结果,但显然cx和x的方向相同)。
这里给出一个特征向量的简单例子,比如平面上的一个变换,把一个向量关于横轴做镜像对称变换,即保持一个向量的横坐标不变,但纵坐标取相反数,把这个变换表示为矩阵就是[1 0;0 -1](分号表示换行),显然[1 0;0 -1]*[a b]\’=[a -b]\’(上标\’表示取转置),这正是我们想要的效果,那么现在可以猜一下了,这个矩阵的特征向量是什么?想想什么向量在这个变换下保持方向不变,显然,横轴上的向量在这个变换下保持方向不变(记住这个变换是镜像对称变换,那镜子表面上(横轴上)的向量当然不会变化),所以可以直接猜测其特征向量是[a 0]\’(a不为0),还有其他的吗?有,那就是纵轴上的向量,这时经过变换后,其方向反向,但仍在同一条轴上,所以也被认为是方向没有变化,所以[0 b]\’(b不为0)也是其特征向量。
综上,特征值只不过反映了特征向量在变换时的伸缩倍数而已,对一个变换而言,特征向量指明的方向才是很重要的,特征值似乎不是那么重要;但是,当我们引用了Spectral theorem(谱定律)的时候,情况就不一样了。
Spectral theorem的核心内容如下:一个线性变换(用矩阵乘法表示)可表示为它的所有的特征向量的一个线性组合,其中的线性系数就是每一个向量对应的特征值,写成公式就是:
从这里我们可以看出,一个变换(矩阵)可由它的所有特征向量完全表示,而每一个向量所对应的特征值,就代表了矩阵在这一向量上的贡献率——说的通俗一点就是能量(power),至此,特征值翻身做主人,彻底掌握了对特征向量的主动:你所能够代表这个矩阵的能量高低掌握在我手中,你还吊什么吊?
我们知道,一个变换可由一个矩阵乘法表示,那么一个空间坐标系也可视作一个矩阵,而这个坐标系就可由这个矩阵的所有特征向量表示,用图来表示的话,可以想象就是一个空间张开的各个坐标角度,这一组向量可以完全表示一个矩阵表示的空间的“特征”,而他们的特征值就表示了各个角度上的能量(可以想象成从各个角度上伸出的长短,越长的轴就越可以代表这个空间,它的“特征”就越强,或者说显性,而短轴自然就成了隐性特征),因此,通过特征向量/值可以完全描述某一几何空间这一特点,使得特征向量与特征值在几何(特别是空间几何)及其应用中得以发挥。
关于特征向量(特别是特征值)的应用实在是太多太多,近的比如俺曾经提到过的PCA方法,选取特征值最高的k个特征向量来表示一个矩阵,从而达到降维分析+特征显示的方法;近的比如Google公司的成名作PageRank,也是通过计算一个用矩阵表示的图(这个图代表了整个Web各个网页“节点”之间的关联)的特征向量来对每一个节点打“特征值”分;再比如很多人脸识别,数据流模式挖掘分析等方面,都有应用,有兴趣的兄弟可以参考IBM的Spiros在VLDB‘ 05,SIGMOD ’06上的几篇文章。
特征向量不仅在数学上,在物理,材料,力学等方面(应力、应变张量)都能一展拳脚,有老美曾在一本线代书里这样说过“有振动的地方就有特征值和特征向量”,确实令人肃然起敬+毛骨悚然……
转特征值物理含义:
1. 特征的数学意义]
我们先考察一种线性变化,例如x,y坐标系的椭圆方程可以写为x^2/a^2+y^2/b^2=1,那么坐标系关于原点做旋转以后,椭圆方程就要发生变换。我们可以把原坐标系的(x,y)乘以一个矩阵,得到一个新的(x\’,y\’)的表示形式,写为算子的形式就是(x,y)*M=(x\’,y\’)。这里的矩阵M代表一种线性变换:拉伸,平移,旋转。那么,有没有什么样的线性变换b(b是一个向量),使得变换后的结果,看起来和让(x,y)*b像是一个数b乘以了一个数字m*b? 换句话说,有没有这样的矢量b,使得矩阵A*b这样的线性变换相当于A在矢量b上面的投影m*b? 如果有,那么b就是A的一个特征向量,m就是对应的一个特征值。一个矩阵的特征向量可以有很多个。特征值可以用特征方程求出,特征向量可以有特征值对应的方程组通解求出,反过来也一样。例如,设A为3阶实对称矩阵,a1=(a,-a,1)T是Ax=0的解,a2=(a,1,-a)T是(A+E)x=0的解,a≠2,则常数a=? 因为a1=(a,-a,1)T是Ax=0的解,说明a1=(a,-a,1)T是A的属于0的特征向量,a2=(a,1,-a)T是(A+E)x=0的解,说明a2=(a,1,-a)T是A的属于-1的特征向量。实对称矩阵属于不同特征值的特征向量式正交的,所以a^2-a-a=0,a≠2,所以a=0。
还是太抽象了,具体的说,求特征向量的关系,就是把矩阵A所代表的空间,进行正交分解,使得A的向量集合可以表示为每个向量a在各个特征向量上面的投影长度。例如A是m*n的矩阵,n>m,那么特征向量就是m个(因为秩最大是m),n个行向量在每个特征向量E上面有投影,其特征值v就是权重。那么每个行向量现在就可以写为Vn=(E1*v1n,E2*v2n…Em*vmn),矩阵变成了方阵。如果矩阵的秩更小,矩阵的存储还可以压缩。再: 由于这些投影的大小代表了A在特征空间各个分量的投影,那么我们可以使用最小2乘法,求出投影能量最大的那些分量,而把剩下的分量去掉,这样最大限度地保存了矩阵代表的信息,同时可以大大降低矩阵需要存储的维度,简称PCA方法。
举个例子,对于x,y平面上的一个点(x,y),我对它作线性变换,(x,y)*[1,0;0,-1],分号代表矩阵的换行,那么得到的结果就是(x,-y),这个线性变换相当于关于横轴x做镜像。我们可以求出矩阵[1,0;0,-1]的特征向量有两个,[1,0]和[0,1],也就是x轴和y轴。什么意思呢? 在x轴上的投影,经过这个线性变换,没有改变。在y轴上的投影,乘以了幅度系数-1,并没有发生旋转。两个特征向量说明了这个线性变换矩阵对于x轴和y轴这两个正交基是线性不变的。对于其他的线性变换矩阵,我们也可以找到类似的,N个对称轴,变换后的结果,关于这N个对称轴线性不变。这N个对称轴就是线性变换A的N个特征向量。这就是特征向量的物理含义所在。所以,矩阵A等价于线性变换A。
对于实际应用的矩阵算法中,经常需要求矩阵的逆:当矩阵不是方阵的时候,无解,这是需要用到奇异值分解的办法,也就是A=PSQ,P和Q是互逆的矩阵,而S是一个方阵,然后就可以求出伪逆的值。同时,A=PSQ可以用来降低A的存储维度,只要P是一个是瘦长形矩阵,Q是宽扁型矩阵。对于A非常大的情况可以降低存储量好几个数量级。
[2. 物理意义]
特征向量有什么具体的物理意义? 例如一个驻波通过一条绳子,绳子上面的每个点组成一个无穷维的向量,这个向量的特征向量就是特征函数sin(t),因为是时变的,就成了特征函数。每个点特征值就是每个点在特定时刻的sin(x+t)取值。再如,从太空中某个角度看地球自转,虽然每个景物的坐标在不断的变换,但是这种变换关于地球的自传轴有对称性,也就是关于此轴的平移和拉伸的坐标变换不敏感。所以地球自转轴,是地球自转这种空间变换的一个特征向量。Google的PageRank,就是对www链接关系的修正邻接矩阵的,主要特征向量的投影分量,给出了页面平分。有什么特性呢? AB和BA有相同的特征向量—-设AB的特征向量为x,对应的特征值为b,则有(AB)x = bx,将上式两边左乘矩阵B,得B(AB)x = (BA)(Bx) = b(Bx),故b为BA的特征值,对应的特征向量为Bx。反之亦然。
什么是特征矩阵和特征值?我们用整体论来考虑,假设P(A)=(1,2,3)是A的3个特征向量。那么P(A^2)就是(1^2,2^2,3^2),P可以看作是一种算子。当然,算子的特性是需要用部分/细节详细证明的。一旦证明,就可以作为整体的特征。特征值有什么特性?说明矩阵可以分解成N维特征向量的投影上面,这N个特征值就是各个投影方向上的长度。由于n*n矩阵A可以投影在一个正交向量空间里面,那么任何N维特征向量组成的矩阵都可以是线性投影变换矩阵,那么I就是一个同用的线性变换投影矩阵。所以对于特征值m,一定有是够成了一个没有线性无关向量的矩阵Aa=ma两边同乘以I得到 Aa=maI,所以(A-mI)a=0有非0解,那么|A-mI|=0(可以用反正法,如果这个行列式不是0,那么N个向量线性无关,在N维空间中只能相交于原点,不可能有非0解)。所以可以推出一些很有用的性质,例如A=[1/2,1,1;0,1/3,1;0,0,1/5],那么只要满足|A- mI|=0的值就是特征值,显然特征值数组立即可以得到(1/2,1/3,1/5)。一个n*n的矩阵A,秩=1,那么最大线性无关组=1组,特征向量=1个,任意n维非零向量都是A的特征向量。特征向量本身不是定死的,这就好比坐标系可以旋转一样。一旦特征向量的各个方向确定了,那么特征值向量也就确定了。求特征值的过程就是用特征方程:|A-mE|=0,P(1/A)=1/P(A),可以证明。有什么物理含义呢?一个N维线性无关的向量,去掉其中的一维,那么就有至少两个向量是线性相关的了,所以行列式=0。特征矩阵有什么作用?把矩阵变化为正定矩阵,也就是A=P^-1BP,这样的变换,A是对角阵。
线性代数的研究,是把向量和矩阵作为一个整体,从部分的性质出发,推到出整体的性质,再由整体的性质得到各种应用和物理上的概念。当矩阵A是一个符号的时候,它的性质会和实数a有很多相似的地方。科学的定理看起来总是递归着的。再举一个例子,高数的基本概念有微分,积分,倒数,那么我立刻可以想到中值定理就应该有3个,形式上分别是微分,积分和倒数。
[3. 应用的场景]
线性变换的缺点:线性变换PCA可以用来处理图像。如2维的人像识别:
1. 我们把图像A看成矩阵,进一步看成线性变换矩阵,把这个训练图像的特征矩阵求出来(假设取了n个能量最大的特征向量)。用A乘以这个n个特征向量,得到一个n维矢量a,也就是A在特征空间的投影。
2. 今后在识别的时候同一类的图像(例如,来自同一个人的面部照片),认为是A的线性相关图像,它乘以这个特征向量,得到n个数字组成的一个矢量b,也就是B在特征空间的投影。那么a和b之间的距离就是我们判断B是不是A的准则。
不过,PCA有天生的缺点,就是线性矢量的相关性考察有”平移无关性”优点的同时,也完全忽略了,2维图形中,矢量分量之间的顺序是有意义的,顺序不同可以代表完全不同的信息。还有,就是图像B必须是A的某种伸缩(由特征向量空间决定的),才能被很好的投影到A的特征向量空间里面,如果B包含了A中的某种旋转因素,那么PCA可以彻底失效。所以实际应用中PCA的方法做图像识别,识别率并不高,它要求图像有某种严格的方向对齐和归一化。所以PCA一般不用来做直接的特征提取而是用来做特征矩阵的降维。当然,降维的结果用于分类并不理想,我们可以进一步做最小二承法拉开类间距离的Fisher变换。但是Fisher变换会引入新的弱点,那就是对于训练类别的数据变得更敏感了,分类效果上升的代价是通用性下降,当类型数量急剧膨胀的时候,分类效果的函数仍然是直线下降的—-但是还是比直接PCA的分类效果好得多。PCA”主观”的认为,一个类型的第N+1个矩阵可以由之前已知的[1,N]个矩阵通过拉成向量来线性表出。显然这只是一个美好的主观愿望,因为即使新的输入矩阵是原有矩阵作了一些行列的初等变换如交换等,这种拉直以后的线性表出也可能根本就不存在(2维的PCA同样无法克服这个客观不存在的设定),于是,当应用到实际的时候,只能试图做优化没,用最小二乘距离来判定,”认为”那个矩阵就是属于某个分类。由于PCA训练的特征矩阵是一个类别一个矩阵,这些矩阵构成的子空间之间又无法保证正交,于是投影的结果也不具有根本意义上的分类特性。这个算法是个实用的算法,但是理论上根本就是无解。
K-L变换是PCA的一个应用形式。假设图像类型C有N个图像,那么把每个图像拉直成一个向量,N个图像的向量组成一个矩阵,求矩阵的特征向量(列向量)。那么用原来的N个图像乘以这些列向量求出平均值,就是我们的特征图像。可以看到特征图像和原图像有相似的地方,但是去掉了和拉伸,平移相关的一些形变信息。在得到了鲁棒性的同时,牺牲了很多精确性。所以它比较适合特定范围图像的Verification工作,也就是判断图像P是不是属于类型C。对比一下神经网络:说白了把函数y=f(x)的映射,变成了[y]=[f(x)]的向量映射。输入输出的点(entry)是固定的。而真实的神经系统,并没有明显的内部处理和外部接口的区分。所以所有的神经网络理论,名字上是神经网络,实质上,差得很远。
[4. 关于谱]
什么是”谱”(Spectrum)? 我们知道音乐是一个动态的过程,但是乐谱却是在纸上的,静态的存在。对于数学分析工具,研究时变函数的工具,可以研究傅立叶变换对应的频率谱;对于概率问题,虽然每次投色子的结果不一样,但是可以求出概率分布的功率谱密度。数学作为一种形而上学工具,研究的重点,就是这个变化世界当中那些不变的规律。
[5. 能用于分类吗]
所谓的特征矩阵,就是原矩阵如何与一个x维的数量矩阵相似。Lamda(i)说明了相似投影与一个x维线性空间的第i维坐标轴,Lamda(i)是放缩比例。Lamda(i)之间的顺序是不重要的,因为坐标轴之间的交换是初等线性变换,不影响代数拓扑的性质。特征向量xi表明A如何把线性组合投影到一个坐标轴上。所谓的特征向量,就是一组正交基集合。
在图像处理的问题域中,把图像看成矩阵本身,那么图像的分类问题就是同类矩阵被认为有相同或者代数近似的”不变量”。显然,”同类”是一个主观假设划定的类,而不是通过计算来”确定”的类。这导致了一个问题,所谓的不同类型,其意义是对于人的主观理解能力而言,是先验的,不是通过计算得到的后验,它本身不代表任何数理逻辑上的可判定信息。如果以矩阵的特征向量或者特征值矩阵作为分类的信息,没有任何证据能够避免不同的”类”的矩阵能够有更加近似的特征值。所谓的矩阵分解方法,类内最小距离方法(Fisher),都有一个令人不愉快地前提,那就是本身就要保证类内的矩阵,其欧式距离足够小—-这个欧式距离的大小往往又和人的几何拓扑直观不符)。由于矩阵本身不具有预定义的拓扑学信息,那么同类图像间欧式距离增加的时候,无法做到良好的分类。同时,图像的类要分的越多,那么这种子空间之间的交叠现象就越严重,及时再去从每个类别的子空间中去寻找线性不变的子空间或者因子,也无法消除这种交叠性—-Fisher算法试图绕过去,但是却付出了严重依赖初始数据的代价和失去通用性的代价。PCA算法试图在统计的意义上得到最好的分类,但是当类型数目增加的时候,以前的参数就作废了,根本无法得到有用的计算流程。由于子空间之间的重叠无法解决,于是分类性便持续下降。原因是什么? 就是因为分类本身不是根据线性变换本身的代数特性去得到的,而是先验的非线性”智慧”的人的判断。于是,由于二元运算为离散集合作分类,必须在线性空间的正交划分中进行,导致了逻辑上的不可调和的悖论。非线性的判定是连续的,几何拓扑的,无穷维德,不可分离变量的,根本就不可建模,于是也就是一个不可判定的问题。
那么不用高等代数的思想,实用信号处理的办法提取局部的特征做比较可以达到分类么? 这个仍然没有回答”先验”分类的问题,仍然是在一个糟糕的前提下试图寻找勉强能用的途径。如何知道一个矩阵的局部其实对应于另一个矩阵上不同位置的局部呢? 这仍然只是一个主观的,直觉主义的判定! 计算机不过是纸和笔的变形,它不能理解意义—即使1+1=2这样的运算结果,它本身也不能判定对错。如果它咨询别的计算机来判断对错呢—-别的计算机又如何能自我证明对错? 根本不能,必须等到一个主体的”人”来观察这个结果,这个结果才会变得有意义。于是就像薛定谔的那只猫一样,她正懒洋洋的晒着太阳冲我微笑呢。形而上学的理论在精妙,也没有超出经验主义的牢笼。
于是,我便不再需要算法,不再需要哲学。