原文链接:http://blog.csdn.net/xiahouzuoxin/article/details/41118351
矩阵的乘法是什么,别只告诉我只是“前一个矩阵的行乘以后一个矩阵的列”,还会一点的可能还会说“前一个矩阵的列数等于后一个矩阵的行数才能相乘”,然而,这里却会和你说——那都是表象。
矩阵乘法真正的含义是变换,我们学《线性代数》一开始就学行变换列变换,那才是线代的核心——别会了点猫腻就忘了本——对,矩阵乘法 就是线性变换,若以其中一个向量A为中心,则B的作用主要是使A发生如下变化:
伸缩
clf;
A = [0, 1, 1, 0, 0;...
1, 1, 0, 0, 1]; % 原空间
B = [3 0; 0 2]; % 线性变换矩阵
plot(A(1,:),A(2,:), '-*');hold on
grid on;axis([0 3 0 3]); gtext('变换前');
Y = B * A;
plot(Y(1,:),Y(2,:), '-r*');
grid on;axis([0 3 0 3]); gtext('变换后');
1
从上图可知,y方向进行了2倍的拉伸,x方向进行了3倍的拉伸,这就是B=[3 0; 0 2]的功劳,3和2就是伸缩比例。请注意,这时B除了对角线元素为各个维度的倍数外,非正对角线元素都为0,因为下面将要看到,对角线元素非0则将会发生切变及旋转的效果。
切变
clf;
A = [0, 1, 1, 0, 0;...
1, 1, 0, 0, 1]; % 原空间
B1 = [1 0; 1 1]; % 线性变换矩阵
B2 = [1 0; -1 1]; % 线性变换矩阵
B3 = [1 1; 0 1]; % 线性变换矩阵
B4 = [1 -1; 0 1]; % 线性变换矩阵
Y1 = B1 * A;
Y2 = B2 * A;
Y3 = B3 * A;
Y4 = B4 * A;
subplot(2,2,1);
plot(A(1,:),A(2,:), '-*'); hold on;plot(Y1(1,:),Y1(2,:), '-r*');
grid on;axis([-1 3 -1 3]);
subplot(2,2,2);
plot(A(1,:),A(2,:), '-*'); hold on;plot(Y2(1,:),Y2(2,:), '-r*');
grid on;axis([-1 3 -1 3]);
subplot(2,2,3);
plot(A(1,:),A(2,:), '-*'); hold on;plot(Y3(1,:),Y3(2,:), '-r*');
grid on;axis([-1 3 -1 3]);
subplot(2,2,4);
plot(A(1,:),A(2,:), '-*'); hold on;plot(Y4(1,:),Y4(2,:), '-r*');
grid on;axis([-1 3 -1 3]);
2
旋转
所有的变换其实都可以通过上面的伸缩和切变变换的到,如果合理地对变换矩阵B取值,能得到图形旋转的效果,如下,
clf;
A = [0, 1, 1, 0, 0;...
1, 1, 0, 0, 1]; % 原空间
theta = pi/6;
B = [cos(theta) sin(theta); -sin(theta) cos(theta)];
Y = B * A;
figure;
plot(A(1,:),A(2,:), '-*'); hold on;plot(Y(1,:),Y(2,:), '-r*');
grid on;axis([-1 3 -1 3]);
3
好,关于矩阵乘就这些了。那么,我们接着就进入主题了,对特定的向量,经过一种方阵变换,经过该变换后,向量的方向不变(或只是反向),而只是进行伸缩变化(伸缩值可以是负值,相当于向量的方向反向)?这个时候我们不妨将书上对特征向量的定义对照一遍:
数学教材定义: 设A是n阶方阵,如果存在 λ 和n维非零向量X,使 ,则 λ 称为方阵A的一个特征值,X为方阵A对应于或属于特征值 λ 的一个特征向量。
上面特定的向量不就是特征向量吗? λ 不就是那个伸缩的倍数吗?因此,特征向量的代数上含义是:将矩阵乘法转换为数乘操作;特征向量的几何含义是:特征向量通过方阵A变换只进行伸缩,而保持特征向量的方向不变。特征值表示的是这个特征到底有多重要,类似于权重,而特征向量在几何上就是一个点,从原点到该点的方向表示向量的方向。
特征向量有一个重要的性质:同一特征值的任意多个特征向量的线性组合仍然是A属于同一特征值的特征向量。关于特征值,网上有一段关于“特征值是震动的谱”的解释:
戏说在朝代宋的时候,我国就与发现矩阵特征值理论的机会擦肩而过。话说没有出息的秦少游在往池塘里扔了一颗小石头后,刚得到一句“投石冲开水底天”的泡妞诗对之后,就猴急猴急地去洞房了,全然没有想到水波中隐含着矩阵的特征值及特征向量的科学大道理。大概地说,水面附近的任一点水珠在原处上下振动(实际上在做近似圆周运动),并没有随着波浪向外圈移动,同时这些上下振动的水珠的幅度在渐渐变小,直至趋于平静。在由某块有着特定质量和形状的石头被以某种角度和速度投入某个面积和深度特定的水池中所决定的某个矩阵中,纹波荡漾中水珠的渐变过程中其特征值起着决定性的作用,它决定着水珠振动的频率和幅度减弱的衰退率。
在理解关于振动的特征值和特征向量的过程中,需要加入复向量和复矩阵的概念,因为在实际应用中,实向量和实矩阵是干不了多少事的。机械振动和电振动有频谱,振动的某个频率具有某个幅度;那么矩阵也有矩阵的谱,矩阵的谱就是矩阵特征值的概念,是矩阵所固有的特性,所有的特征值形成了矩阵的一个频谱,每个特征值是矩阵的一个“谐振频点”。
美国数学家斯特让(G..Strang)在其经典教材《线性代数及其应用》中这样介绍了特征值作为频率的物理意义,他说:
大概最简单的例子(我从不相信其真实性,虽然据说1831年有一桥梁毁于此因)是一对士兵通过桥梁的例子。传统上,他们要停止齐步前进而要散步通过。这个理由是因为他们可能以等于桥的特征值之一的频率齐步行进,从而将发生共振。就像孩子的秋千那样,你一旦注意到一个秋千的频率,和此频率相配,你就使频率荡得更高。一个工程师总是试图使他的桥梁或他的火箭的自然频率远离风的频率或液体燃料的频率;而在另一种极端情况,一个证券经纪人则尽毕生精力于努力到达市场的自然频率线。特征值是几乎任何一个动力系统的最重要的特征。
其实,这个矩阵之所以能形成“频率的谱”,就是因为矩阵在特征向量所指的方向上具有对向量产生恒定的变换作用:增强(或减弱)特征向量的作用。进一步的,如果矩阵持续地叠代作用于向量,那么特征向量的就会凸现出来。
更多关于特征向量及特征值的实际例子参见Wikipedia: http://zh.wikipedia.org/wiki/特征向量 。
设A有n个特征值及特征向量,则:
将上面的写到一起成矩阵形式:
若(x1,x2,...,xn)可逆,则左右两边都求逆,则方阵A可直接通过特征值和特征向量进行唯一的表示,令
Q=(x1,x2,...,xn)
Σ = diag(λ1, λ2, ..., λn)
则 ,该表达式称为方阵的特征值分解,这样方阵A就被特征值和特征向量唯一表示。
一个变换方阵的所有特征向量组成了这个变换矩阵的一组基。所谓基,可以理解为坐标系的轴。我们平常用到的大多是直角坐标系,在线性代数中可以把这个坐标系扭曲、拉伸、旋转,称为基变换。我们可以按需求去设定基,但是基的轴之间必须是线性无关的,也就是保证坐标系的不同轴不要指向同一个方向或可以被别的轴组合而成,否则的话原来的空间就“撑”不起来了。从线性空间的角度看,在一个定义了内积的线性空间里,对一个N阶对称方阵进行特征分解,就是产生了该空间的N个标准正交基,然后把矩阵投影到这N个基上。N个特征向量就是N个标准正交基,而特征值的模则代表矩阵在每个基上的投影长度。特征值越大,说明矩阵在对应的特征向量上的方差越大,功率越大,信息量越多。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。
在机器学习特征提取中,意思就是最大特征值对应的特征向量方向上包含最多的信息量,如果某几个特征值很小,说明这几个方向信息量很小,可以用来降维,也就是删除小特征值对应方向的数据,只保留大特征值方向对应的数据,这样做以后数据量减小,但有用信息量变化不大,PCA降维就是基于这种思路。
Matlab中通过eig函数就可求得特征值和特征向量矩阵。
>> B = [ 3 -2 -.9 2*eps
-2 4 1 -eps
-eps/4 eps/2 -1 0
-.5 -.5 .1 1 ]
B =
3.0000 -2.0000 -0.9000 0.0000
-2.0000 4.0000 1.0000 -0.0000
-0.0000 0.0000 -1.0000 0
-0.5000 -0.5000 0.1000 1.0000
>> [V D] = eig(B)
V =
0.6153 -0.4176 -0.0000 -0.1437
-0.7881 -0.3261 -0.0000 0.1264
-0.0000 -0.0000 -0.0000 -0.9196
0.0189 0.8481 1.0000 0.3432
D =
5.5616 0 0 0
0 1.4384 0 0
0 0 1.0000 0
0 0 0 -1.0000
D对角线的元素即为特征值(表示了伸缩的比例),D就是特征值分解公式中的Q,V的每一列与D没列对应,表示对应的特征向量,即特征值分解中的Σ。
特征值分解是一个提取矩阵特征很不错的方法,但是它只适用于方阵。而在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有M个学生,每个学生有N科成绩,这样形成的一个M * N的矩阵就可能不是方阵,我们怎样才能像描述特征值一样描述这样一般矩阵呢的重要特征呢?奇异值分解就是用来干这个事的,奇异值分解是一个能适用于任意的矩阵的一种分解的方法。我们有必要先说说特征值和奇异值之间的关系。
对于特征值分解公式, ATA 是方阵,我们求 ATA 的特征值,即 ,此时求得的特征值就对应奇异值的平方,求得的特征向量v称为右奇异向量,另外还可以得到:
所求的ui就是左奇异向量, σi 就是奇异值。已有人对SVD的几何机理做了清晰的分析,非常受用,就不重复造轮子,下文为转载自http://blog.sciencenet.cn/blog-696950-699432.html 。
PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义。能在有限的篇幅把这个问题讲解的如此清晰,实属不易。原文举了一个简单的图像处理问题,简单形象,真心希望路过的各路朋友能从不同的角度阐述下自己对SVD实际意义的理解,比如 个性化推荐中应用了SVD,文本以及Web挖掘的时候也经常会用到SVD。
英文原文:We recommend a singular value decomposition
简介
SVD实际上是数学专业内容,但它现在已经渗入到不同的领域中。SVD的过程不是很好理解,因为它不够直观,但它对矩阵分解的效果却非常好。比如,Netflix(一个提供在线电影租赁的公司)曾经就悬赏100万美金,如果谁能提高它的电影推荐系统评分预测准确率提高10%的话。令人惊讶的是,这个目标充满了挑战,来自世界各地的团队运用了各种不同的技术。最终的获胜队伍"BellKor's Pragmatic Chaos"采用的核心算法就是基于SVD。
SVD提供了一种非常便捷的矩阵分解方式,能够发现数据中十分有意思的潜在模式。在这篇文章中,我们将会提供对SVD几何上的理解和一些简单的应用实例。
线性变换的几何意义(The geometry of linear transformations)
让我们来看一些简单的线性变换例子,以 2 X 2 的线性变换矩阵为例,首先来看一个较为特殊的,对角矩阵:
从几何上讲,M 是将二维平面上的点(x,y)经过线性变换到另外一个点的变换矩阵,如下图所示
变换的效果如下图所示,变换后的平面仅仅是沿 X 水平方面进行了拉伸3倍,垂直方向是并没有发生变化。
现在看下矩阵
这个矩阵产生的变换效果如下图所示
这种变换效果看起来非常的奇怪,在实际环境下很难描述出来变换的规律 ( 这里应该是指无法清晰辨识出旋转的角度,拉伸的倍数之类的信息)。还是基于上面的对称矩阵,假设我们把左边的平面旋转45度角,然后再进行矩阵M 的线性变换,效果如下图所示:
看起来是不是有点熟悉? 对的,经过 M 线性变换后,跟前面的对角矩阵的功能是相同的,都是将网格沿着一个方向拉伸了3倍。
这里的 M 是一个特例,因为它是对称的。非特殊的就是我们在实际应用中经常遇见一些 非对称的,非方阵的矩阵。如上图所示,如果我们有一个 2 X 2 的对称矩阵M 的话,我们先将网格平面旋转一定的角度,M 的变换效果就是在两个维度上进行拉伸变换了。
用更加数学的方式进行表示的话,给定一个对称矩阵 M ,我们可以找到一些相互正交Vi ,满足MVi 就是沿着Vi 方向的拉伸变换,公式如下:
Mvi = λivi
这里的 λi 是拉伸尺度(scalar)。从几何上看,M 对向量 Vi 进行了拉伸,映射变换。Vi 称作矩阵 M 的特征向量(eigenvector),λi 称作为矩阵M 特征值(eigenvalue)。这里有一个非常重要的定理,对称矩阵M 的特征向量是相互正交的。
如果我们用这些特征向量对网格平面进行线性变换的话,再通过 M 矩阵对网格平面进行线性换的效果跟对M 矩阵的特征向量进行线性变换的效果是一样的。
对于更为普通的矩阵而言,我们该怎么做才能让一个原来就是相互垂直的网格平面(orthogonal grid), 线性变换成另外一个网格平面同样垂直呢?PS:这里的垂直如图所示,就是两根交错的线条是垂直的。
经过上述矩阵变换以后的效果如图
从图中可以看出,并没有达到我们想要的效果。我们把网格平面旋转 30 度角的话,然后再进行同样的线性变换以后的效果,如下图所示
让我们来看下网格平面旋转60度角的时候的效果。
嗯嗯,这个看起来挺不错的样子。如果在精确一点的话,应该把网格平面旋转 58.28 度才能达到理想的效果。
几何意义
该部分是从几何层面上去理解二维的SVD:对于任意的 2 x 2 矩阵,通过SVD可以将一个相互垂直的网格(orthogonal grid)变换到另外一个相互垂直的网格。
我们可以通过向量的方式来描述这个事实: 首先,选择两个相互正交的单位向量 v1和v2, 向量Mv1 和 Mv2 正交。
u1 和u2分别表示Mv1 和 Mv2的单位向量,σ1 * u1 = Mv1 和 σ2 * u2 = Mv2。σ1 和 σ2分别表示这不同方向向量上的模,也称作为矩阵M 的奇异值。
这样我们就有了如下关系式
Mv1 = σ1u1
Mv2 = σ2u2
我们现在可以简单描述下经过 M 线性变换后的向量 x 的表达形式。由于向量v1 和v2是正交的单位向量,我们可以得到如下式子:
x = (v1x)v1 + (v2
x)v2
这就意味着:
Mx = (v1x)Mv1 + (v2
x)Mv2
Mx = (v1x) σ1u1 + (v2
x) σ2u2
向量内积可以用向量的转置来表示,如下所示
vx = vTx
最终的式子为
Mx = u1σ1 v1Tx + u2σ2 v2Tx
M =u1σ1 v1T + u2σ2 v2T
上述的式子经常表示成
M =UΣVT
u 矩阵的列向量分别是u1,u2,Σ是一个对角矩阵,对角元素分别是对应的σ1 和 σ2,V矩阵的列向量分别是v1,v2。上角标T 表示矩阵 V 的转置。
这就表明任意的矩阵 M 是可以分解成三个矩阵。V表示了原始域的标准正交基,u表示经过M 变换后的co-domain的标准正交基,Σ表示了V中的向量与u中相对应向量之间的关系。(V describes an orthonormal basis in the domain, and U describes an orthonormal basis in the co-domain, and Σ describes how much the vectors in V are stretched to give the vectors in U.)
如何获得奇异值分解?( How do we find the singular decomposition? )
事实上我们可以找到任何矩阵的奇异值分解,那么我们是如何做到的呢?假设在原始域中有一个单位圆,如下图所示。经过 M 矩阵变换以后在co-domain中单位圆会变成一个椭圆,它的长轴(Mv1)和短轴(Mv2)分别对应转换后的两个标准正交向量,也是在椭圆范围内最长和最短的两个向量。
换句话说,定义在单位圆上的函数|Mx|分别在v1和v2方向上取得最大和最小值。这样我们就把寻找矩阵的奇异值分解过程缩小到了优化函数|Mx|上了。结果发现(具体的推到过程这里就不详细介绍了)这个函数取得最优值的向量分别是矩阵 MT M 的特征向量。由于MTM是对称矩阵,因此不同特征值对应的特征向量都是互相正交的,我们用vi 表示MTM的所有特征向量。奇异值σi = |Mvi| , 向量 ui 为 Mvi 方向上的单位向量。但为什么ui也是正交的呢?
推倒如下:
σi 和 σj分别是不同两个奇异值
Mvi = σiui
Mvj = σjuj.
我们先看下MviMvj,并假设它们分别对应的奇异值都不为零。一方面这个表达的值为0,推到如下
Mvi Mvj = viTMT Mvj = vi
MTMvj = λjvi
vj = 0
另一方面,我们有
Mvi Mvj = σiσj ui
uj = 0
因此,ui 和uj是正交的。但实际上,这并非是求解奇异值的方法,效率会非常低。这里也主要不是讨论如何求解奇异值,为了演示方便,采用的都是二阶矩阵。
应用实例(Another example)
现在我们来看几个实例。
实例一
经过这个矩阵变换后的效果如下图所示
在这个例子中,第二个奇异值为 0,因此经过变换后只有一个方向上有表达。
M =u1σ1 v1T.
换句话说,如果某些奇异值非常小的话,其相对应的几项就可以不同出现在矩阵 M 的分解式中。因此,我们可以看到矩阵 M 的秩的大小等于非零奇异值的个数。
实例二
我们来看一个奇异值分解在数据表达上的应用。假设我们有如下的一张 15 x 25 的图像数据。
如图所示,该图像主要由下面三部分构成。
我们将图像表示成 15 x 25 的矩阵,矩阵的元素对应着图像的不同像素,如果像素是白色的话,就取 1,黑色的就取 0. 我们得到了一个具有375个元素的矩阵,如下图所示
如果我们对矩阵M进行奇异值分解以后,得到奇异值分别是
σ1 = 14.72
σ2 = 5.22
σ3 = 3.31
矩阵M就可以表示成
M=u1σ1 v1T + u2σ2 v2T + u3σ3 v3T
vi具有15个元素,ui 具有25个元素,σi 对应不同的奇异值。如上图所示,我们就可以用123个元素来表示具有375个元素的图像数据了。
实例三
减噪(noise reduction)
前面的例子的奇异值都不为零,或者都还算比较大,下面我们来探索一下拥有零或者非常小的奇异值的情况。通常来讲,大的奇异值对应的部分会包含更多的信息。比如,我们有一张扫描的,带有噪声的图像,如下图所示
我们采用跟实例二相同的处理方式处理该扫描图像。得到图像矩阵的奇异值:
σ1 = 14.15
σ2 = 4.67
σ3 = 3.00
σ4 = 0.21
σ5 = 0.19
...
σ15 = 0.05
很明显,前面三个奇异值远远比后面的奇异值要大,这样矩阵 M 的分解方式就可以如下:
M u1σ1 v1T + u2σ2 v2T + u3σ3 v3T
经过奇异值分解后,我们得到了一张降噪后的图像。
实例四
数据分析(data analysis)
我们搜集的数据中总是存在噪声:无论采用的设备多精密,方法有多好,总是会存在一些误差的。如果你们还记得上文提到的,大的奇异值对应了矩阵中的主要信息的话,运用SVD进行数据分析,提取其中的主要部分的话,还是相当合理的。
作为例子,假如我们搜集的数据如下所示:
我们将数据用矩阵的形式表示:
经过奇异值分解后,得到
σ1 = 6.04
σ2 = 0.22
由于第一个奇异值远比第二个要大,数据中有包含一些噪声,第二个奇异值在原始矩阵分解相对应的部分可以忽略。经过SVD分解后,保留了主要样本点如图所示
就保留主要样本数据来看,该过程跟PCA( principal component analysis)技术有一些联系,PCA也使用了SVD去检测数据间依赖和冗余信息.
总结(Summary)
这篇文章非常的清晰的讲解了SVD的几何意义,不仅从数学的角度,还联系了几个应用实例形象的论述了SVD是如何发现数据中主要信息的。在netflix prize中许多团队都运用了矩阵分解的技术,该技术就来源于SVD的分解思想,矩阵分解算是SVD的变形,但思想还是一致的。之前算是能够运用矩阵分解技术于个性化推荐系统中,但理解起来不够直观,阅读原文后醍醐灌顶,我想就从SVD能够发现数据中的主要信息的思路,就几个方面去思考下如何利用数据中所蕴含的潜在关系去探索个性化推荐系统。也希望路过的各位大侠不吝分享呀。
SVD分解
SVD之所以很有效,是因为:在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。在这里,我们用图像简单的实践一下SVD的大妙处,下面是matlab对图像进行SVD分解的例子,
I = imread('lena_gray.bmp'); % 512x512的Lena图像
im = double(I);
[s,v,d]=svd(im); % svd分解,svd分解后特征值v对角线按从大到小排列,因此可以选择特征值大的进行恢复
recv1=s(:,1:20)*v(1:20,1:50)*d(:,1:50)'; % svd取最高的100个特征值进行恢复
recv2=s(:,1:50)*v(1:50,1:100)*d(:,1:100)'; % svd取最高的100个特征值进行恢复
recv3=s(:,1:200)*v(1:200,1:200)*d(:,1:200)'; % svd取最高的100个特征值进行恢复
subplot(221);imshow(I);
title('原图');
subplot(222);imshow(mat2gray(recv1));
title('恢复:左奇异20、右奇异50');
subplot(223);imshow(mat2gray(recv2));
title('恢复:左奇异50、右奇异100');
subplot(224);imshow(mat2gray(recv3));
title('恢复:左奇异200、右奇异200');
图注:SVD二维图像压缩恢复
如果按左下角的方式压缩原图,则存储量变为:50x50+100x100+50=12500,而存储原图像的存储量为512x512=262144,则压缩比为262144/12500=20.97,这里没有考虑存储数据类型的差异。
SVD分解相对于特征值分解的优势就是:
另外值得注意的一点:不论是奇异值分解还是特征值分解,分解出来的特征向量都是正交的。
关于奇异值与PCA的关系, http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html 给了很好的解释,也直接整理过来,感谢原作者:
图注:SVD与PCA
PCA就是一种用于对数据进行降维的方法(降维肯定会丢失数据,只不过能在减少大量存储量的同时损失尽可能少),参见之前matlab对图像进行SVD分解的例子,更容易理解:实现了SVD就实现了PCA,PCA仅是SVD的包装。
PCA的应用很广,主要用在机器学习中对特征进行降维,还能用于去噪,下面两图是PCA降维和PCA去噪的例子(图片来自邹博PPT:北京9月秋季班·机器学习初步)
图注:PCA降维
降维说白了就是将信息通过投影到更低得多维度,这样必然会带来信息的丢失,但就如上图,这种信息的丢失却有时对分类没有影响,反而能降低识别算法的维度,提高速度,缓解所谓的维度灾难。
图注:PCA去噪
PCA去噪的前提是噪声的特征值会比信号的特征值小,即信噪比高的情况,否则PCA去噪会产生逆效果——把信号去掉了而噪声没去掉。
SVD还有其它很多方面的应用,通过查找资料,这里先做个简单的罗列,有机会再一个个研究:
另外,开源视觉库OpenCV中也提供SVD分解的算法。
References:
Gilbert Strang,Linear Algebra and Its Applications. Brooks Cole
William H. Presset al,Numercial Recipes in C: The Art of Scientific Computing. Cambridge University Press.
Dan Kalman, A Singularly Valuable Decomposition: The SVD of a Matrix, The College Mathematics Journal 27 (1996), 2-23.