奇异值的物理意义是什么?
矩阵奇异值的物理意义是什么?
或者说,奇异值形象一点的意义是什么?把m*n矩阵看作从m维空间到n维空间的一个线性映射,
是否:
各奇异向量就是坐标轴,奇异值就是对应坐标的系数?(题目可能问得不好,欢迎帮忙修改)
矩阵的奇异值是一个数学意义上的概念,一般是由奇异值分解(Singular Value Decomposition,简称SVD分解)得到。如果要问奇异值表示什么物理意义,那么就必须考虑在不同的实际工程应用中奇异值所对应的含义。下面先尽量避开严格的数学符号推导,直观的从一张图片出发,让我们来看看奇异值代表什么意义。
这是女神上野树里(Ueno Juri)的一张照片,像素为高度450*宽度333。暂停舔屏先(痴汉脸
我们都知道,图片实际上对应着一个矩阵,矩阵的大小就是像素大小,比如这张图对应的矩阵阶数就是450*333,矩阵上每个元素的数值对应着像素值。我们记这个像素矩阵为
现在我们对矩阵进行奇异值分解。直观上,奇异值分解将矩阵分解成若干个秩一矩阵之和,用公式表示就是:
其中等式右边每一项前的系数就是奇异值,和分别表示列向量,秩一矩阵的意思是矩阵秩为1。注意到每一项都是秩为1的矩阵。我们假定奇异值满足(奇异值大于0是个重要的性质,但这里先别在意),如果不满足的话重新排列顺序即可,这无非是编号顺序的问题。
既然奇异值有从大到小排列的顺序,我们自然要问,如果只保留大的奇异值,舍去较小的奇异值,这样(1)式里的等式自然不再成立,那会得到怎样的矩阵——也就是图像?
令,这只保留(1)中等式右边第一项,然后作图:
结果就是完全看不清是啥……我们试着多增加几项进来:,再作图
隐约可以辨别这是短发伽椰子的脸……但还是很模糊,毕竟我们只取了5个奇异值而已。下面我们取20个奇异值试试,也就是(1)式等式右边取前20项构成
虽然还有些马赛克般的模糊,但我们总算能辨别出这是Juri酱的脸。当我们取到(1)式等式右边前50项时:
我们得到和原图差别不大的图像。也就是说当从1不断增大时,不断的逼近。让我们回到公式
矩阵表示一个450*333的矩阵,需要保存个元素的值。等式右边和分别是450*1和333*1的向量,每一项有个元素。如果我们要存储很多高清的图片,而又受限于存储空间的限制,在尽可能保证图像可被识别的精度的前提下,我们可以保留奇异值较大的若干项,舍去奇异值较小的项即可。例如在上面的例子中,如果我们只保留奇异值分解的前50项,则需要存储的元素为,和存储原始矩阵相比,存储量仅为后者的26%。
下面可以回答题主的问题:奇异值往往对应着矩阵中隐含的重要信息,且重要性和奇异值大小正相关。每个矩阵都可以表示为一系列秩为1的“小矩阵”之和,而奇异值则衡量了这些“小矩阵”对于的权重。
在图像处理领域,奇异值不仅可以应用在数据压缩上,还可以对图像去噪。如果一副图像包含噪声,我们有理由相信那些较小的奇异值就是由于噪声引起的。当我们强行令这些较小的奇异值为0时,就可以去除图片中的噪声。如下是一张25*15的图像(本例来源于[1])
但往往我们只能得到如下带有噪声的图像(和无噪声图像相比,下图的部分白格子中带有灰色):
通过奇异值分解,我们发现矩阵的奇异值从大到小分别为:14.15,4.67,3.00,0.21,……,0.05。除了前3个奇异值较大以外,其余奇异值相比之下都很小。强行令这些小奇异值为0,然后只用前3个奇异值构造新的矩阵,得到
可以明显看出噪声减少了(白格子上灰白相间的图案减少了)。
奇异值分解还广泛的用于主成分分析(Principle Component Analysis,简称PCA)和推荐系统(如Netflex的电影推荐系统)等。在这些应用领域,奇异值也有相应的意义。
考虑题主在问题描述中的叙述:“把m*n矩阵看作从m维空间到n维空间的一个线性映射,是否:各奇异向量就是坐标轴,奇异值就是对应坐标的系数?”我猜测,题主更想知道的是奇异值在数学上的几何含义,而非应用中的物理意义。下面简单介绍一下奇异值的几何含义,主要参考文献是美国数学协会网站上的文章[1]。
下面的讨论需要一点点线性代数的知识。线性代数中最让人印象深刻的一点是,要将矩阵和空间中的线性变换视为同样的事物。比如对角矩阵作用在任何一个向量上
其几何意义为在水平方向上拉伸3倍,方向保持不变的线性变换。换言之对角矩阵起到作用是将水平垂直网格作水平拉伸(或者反射后水平拉伸)的线性变换。
如果不是对角矩阵,而是一个对称矩阵
那么,我们也总可以找到一组网格线,使得矩阵作用在该网格上仅仅表现为(反射)拉伸变换,而没有旋转变换
考虑更一般的非对称矩阵
很遗憾,此时我们再也找不到一组网格,使得矩阵作用在该网格上之后只有拉伸变换(找不到背后的数学原因是对一般非对称矩阵无法保证在实数域上可对角化,不明白也不要在意)。我们退求其次,找一组网格,使得矩阵作用在该网格上之后允许有拉伸变换和旋转变换,但要保证变换后的网格依旧互相垂直。这是可以做到的
下面我们就可以自然过渡到奇异值分解的引入。奇异值分解的几何含义为:对于任何的一个矩阵,我们要找到一组两两正交单位向量序列,使得矩阵作用在此向量序列上后得到新的向量序列保持两两正交。下面我们要说明的是,奇异值的几何含义为:这组变换后的新的向量序列的长度。
当矩阵作用在正交单位向量和上之后,得到和也是正交的。令和分别是和方向上的单位向量,即,,写在一起就是,整理得:
这样就得到矩阵的奇异值分解。奇异值和分别是和的长度。很容易可以把结论推广到一般维情形。
下面给出一个更简洁更直观的奇异值的几何意义(参见[2])。先来一段线性代数的推导,不想看也可以略过,直接看黑体字几何意义部分:
假设矩阵的奇异值分解为
其中是二维平面的向量。根据奇异值分解的性质,线性无关,线性无关。那么对二维平面上任意的向量,都可以表示为:。
当作用在上时,
令,我们可以得出结论:如果是在单位圆上,那么正好在椭圆上。这表明:矩阵将二维平面中单位圆变换成椭圆,而两个奇异值正好是椭圆的两个半轴长,长轴所在的直线是,短轴所在的直线是.
推广到一般情形:一般矩阵将单位球变换为超椭球面,那么矩阵的每个奇异值恰好就是超椭球的每条半轴长度。
参考文献:
[1] We Recommend a Singular Value Decomposition(Feature Column from the AMS)
[2] 徐树方,《矩阵计算的理论与方法》,北京大学出版社。
让我们从小时候玩过的翻绳游戏开始这个问题的讲解。
1 翻绳
对于翻绳的这个花型而言,是由四只手完成的:
我们可以认为这个花型是由两个方向的力合成的:
容易想象,如果其中一个力(相比另外一个力而言)比较小的话,那么绳子的形状基本上由大的那个力来决定:
2 奇异值分解与奇异值
类比于翻绳,我们可以认为:
- 奇异值分解,就是把矩阵分成多个“分力”
- 奇异值的大小,就是各个“分力”的大小
2.1 奇异值分解
下面通过一个具体的矩阵例子来解释下,比如:
根据之前的类比,矩阵是“力”,“力”怎么画出来呢?
翻绳游戏中的“力”要通过绳子的形状来观察。很显然要观察矩阵也需要一个载体。
我们通过单位圆来观察矩阵:
把这个单位圆的每一点都通过 进行变换,得到一个椭圆(我把单位圆保留下来了,作为一个比较):
对 进行奇异值分解:
实际上,将 分为了两个“分力”:
我们来看看第一个“分力” ,作用在单位圆这个“橡皮筋”上的效果:
可怜的“橡皮筋”被拉成了一根线段。
我们来看看第二个“分力” ,作用在单位圆这个“橡皮筋”上的效果:
可怜的“橡皮筋”被拉成了另外一根线段。
这两个“分力”一起作用的时候,可以想象(画面自行脑补),单位圆这个“橡皮筋”被拉成了椭圆:
2.2 奇异值的大小
刚才举的矩阵的两个“分力”大小,只相差一倍,如果相差很大会怎么样?
换一个矩阵 ,对它进行奇异值分解:
这两个“分力”的奇异值相差就很大,大概相差了40倍。
单位圆被 映射成了短轴和长轴相差太大的椭圆,看起来和直线差不多:
我们试试,把小的那个奇异值去掉会怎么样:
把单位圆变为了一根直线:
这个直线和之前的椭圆看上去差不多。
回到之前的比喻,两个相差很大的分力作用在“橡皮筋”上,“橡皮筋”的形状可以说完全取决于大的那个分力。
2.3 奇异值为什么这么神奇?
奇异值分解实际上把矩阵的变换分为了三部分:
- 旋转
- 拉伸
- 投影
拿刚才的:
举例子(方阵没有投影,不过不影响这里思考):
单位圆先被旋转,是没有形变的:
再进行拉伸,这里决定了单位圆的形状,奇异值分别是椭圆的长轴和短轴:
最后,被旋转到最终的位置,这一过程也没有发生形变:
所以,奇异值决定了形变,大小决定在形变中的重要性。
3 总结
根据奇异值分解、以及奇异值的特点,有很多应用。
比如,可以把图片转为矩阵,通过丢弃不重要的奇异值,进行压缩:
比如,可以把很多数据放在矩阵中,通过丢弃不重要的奇异值,来减小处理量。
还比如,可以从矩阵中,找到最大的奇异值,从而得到数据最重要的特征。
我也来贡献个例子!
首先有请 the first lady of image processing!
我比较喜欢这张完整的照片!
***
完整照片悲剧了,被举报了。所以想看照片的自己去下载吧!
The Complete Lenna Story
我只能做到这里了。。。 。。。
***
我留下部分matalb的实验结果(修改了),看看知乎小编能不能让通过。
原图是1129x620 (683.57 kb);
所以SVD分解后,我们有620个奇异值;
假设我们只保留前50个值;结论是:我们保留了原图约70%的信息,而保留图像只需要 85.45 kb;
假设我们只保留前200个值;结论是:我们保留了原图约91%的信息,而保留图像只需要 341.80 kb; 几乎是原图的一般,而其此时人眼基本上很难区分了。
以下下是matlab的代码: 可以修改变量Pos的值来观察结果!
% Using SVD method to compress images
% Load the Lenna image and turn rgb image into gray image.
clc;clear;
lenna = imread("lenna_original_1972.jpg");
lenna = rgb2gray(lenna);
figure(1); clf;
subplot(1,3,1);
imshow(lenna);
title("Original Image");
xlabel(ByteSize(lenna));
% Using the SVD method to compress the images
[U,S,V] = svd(double(lenna));
singularValue = diag(S);
Rate = cumsum(singularValue)/sum(singularValue);
subplot(1,3,2)
Pos = 180; % 1 to 620
plot(Rate,"r.");hold on;
line([Pos Pos], [0 Rate(Pos)], "linewidth",2,"Marker","o");
%line([180,0],[180,Rate(180)],"r", "Marker", "o"); hold off;
txt1 = strcat("leftarrow ",num2str(Rate(Pos)));
text(Pos,Rate(Pos),txt1);
% Using the first Pos singular value and vectors to reconstruct the image
lenna_R = U(:,1:Pos)*S(1:Pos,1:Pos)*V(:,1:Pos)";
lenna_R = mat2gray(lenna_R);
lenna_R = uint8(255 * mat2gray(lenna_R));
subplot(1,3,3);
imshow(lenna_R);
title(strcat("Reconstructed Image :", num2str(Rate(Pos)*100),"%"));
xlabel(ByteSize(lenna_R));
ElementNum = size(U,1)*Pos + Pos + size(V,1)*Pos;
xlabel(ByteSize(uint8(255 * mat2gray(rand(1,ElementNum)))));
% 这个是计算变量体积的函数
function str = ByteSize(in, fid)
% BYTESIZE writes the memory usage of the provide variable to the given file
% identifier. Output is written to screen if fid is 1, empty or not provided.
if nargin == 1 || isempty(fid)
fid = 1;
end
s = whos("in");
%fprintf(fid,[Bytes2str(s.bytes) "
"]);
str = Bytes2str(s.bytes);
end
function str = Bytes2str(NumBytes)
% BYTES2STR Private function to take integer bytes and convert it to
% scale-appropriate size.
scale = floor(log(NumBytes)/log(1024));
switch scale
case 0
str = [sprintf("%.0f",NumBytes) " b"];
case 1
str = [sprintf("%.2f",NumBytes/(1024)) " kb"];
case 2
str = [sprintf("%.2f",NumBytes/(1024^2)) " Mb"];
case 3
str = [sprintf("%.2f",NumBytes/(1024^3)) " Gb"];
case 4
str = [sprintf("%.2f",NumBytes/(1024^4)) " Tb"];
case -inf
% Size occasionally returned as zero (eg some Java objects).
str = "Not Available";
otherwise
str = "Over a petabyte!!!";
end
end
我从奇异值分解(SVD)和主成分分析(PCA)的关系的角度来谈谈奇异值(以及SVD得到的另外两个矩阵)的物理意义。
设X是一个n*m的数据矩阵(在此不把它理解成变换),每一列表示一个数据点,每一行表示一维特征。
对X做主成分分析(PCA)的时候,需要求出各维特征的协方差,这个协方差矩阵是。
(其实需要先把数据平移使得数据的均值为0,不过在此忽略这些细节)
PCA做的事情,是对这个协方差矩阵做对角化:
可以这样理解上式右边各项的物理意义:用一个均值为0的多维正态分布来拟合数据,则正交矩阵P的每一列是正态分布的概率密度函数的等高线(椭圆)的各个轴的方向,而对角矩阵的对角线元素是数据在这些方向上的方差,它们的平方根跟椭圆各个轴的长度成正比。
现在来看数据矩阵X的奇异值分解:,其中U、V各列是单位正交的,S是对角阵,对角元非零。
由此式可以得到。
也就是说,SVD中的矩阵U相当于PCA中的矩阵P,不过仅保留了的非零特征值对应的那些特征向量,而(也只保留了非零特征值)。
所以,SVD中的U代表了X中数据形成的正态分布的轴的方向(一组单位正交基),代表了这些轴的长度(分布的标准差)。
那么V呢?可以把US放在一起看成一个由伸缩和旋转组成的坐标变换(不包括平移),数据矩阵X是由数据矩阵经此变换得来的,而的各列(V的各行)则服从标准正态分布。这也就是说,的各维特征(的各行,V的各列)是互不相关的且各自的方差均为1,也就是说V的各列是单位正交的。
现在换一个角度,把X中的各行看作数据,那么就也有了新的理解。
现在,的各行(V的各列)就成了X的各行形成的正态分布的轴向(单位正交基),是这些轴的长度,而U中的各行数据服从标准正态分布,U的各列单位正交。
奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中。而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景。奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性。就像是描述一个人一样,给别人描述说这个人长得浓眉大眼,方脸,络腮胡,而且带个黑框的眼镜,这样寥寥的几个特征,就让别人脑海里面就有一个较为清楚的认识,实际上,人脸上的特征是有着无数种的,之所以能这么描述,是因为人天生就有着非常好的抽取重要特征的能力,让机器学会抽取重要的特征,SVD是一个重要的方法。
在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature
reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层次检索的LSI(Latent
Semantic Indexing)。
SVD的过程不是很好理解,因为它不够直观,但它对矩阵分解的效果却非常好。比如,Netflix(一个提供在线电影租赁的公司)曾经就悬赏100万美金,如果谁能提高它的电影推荐系统评分预测准确率提高10%的话。令人惊讶的是,这个目标充满了挑战,来自世界各地的团队运用了各种不同的技术。最终的获胜队伍"BellKor"s
Pragmatic Chaos"采用的核心算法就是基于SVD。
SVD提供了一种非常便捷的矩阵分解方式,能够发现数据中十分有意思的潜在模式。在这篇文章中,我们将会提供对SVD几何上的理解和一些简单的应用实例。首先从几何层面上去理解二维的SVD:
这就表明任意的矩阵 A 是可以分解成三个矩阵相乘的形式。V表示了原始域的标准正交基,U表示经过A 变换后的co-domain的标准正交基,Σ表示了V 中的向量与U中相对应向量之间的关系。我们仔细观察上图发现,线性变换A可以分解为旋转、缩放、旋转这三种基本线性变换。
,是对角阵,表示奇异值,A矩阵的作用是将一个向量在V这组正交基向量的空间旋转,并对每个方向进行了一定的缩放,缩放因子就是各个奇异值。然后在U这组正交基向量的空间再次旋转。可以说奇异值分解将一个矩阵原本混合在一起的三种作用效果,分解出来了。
接下来我们从分解的角度重新理解前面的表达式,我们把原来的矩阵A表达成了n个矩阵的和:
这个式子有什么用呢?注意到,我们假定是按降序排列的,它在某种程度上反映了对应项Mi在A中的“贡献”。越大,说明对应的Mi在A的分解中占据的比重也越大。所以一个很自然的想法是,我们是不是可以提取出Mi中那些对A贡献最大的项,把它们的和作为对A的近似?
答案是肯定的,不过等一下,这个想法好像似曾相识?对了,多元统计分析中经典的主成分分析就是这样做的。在主成分分析中,我们把数据整体的变异分解成若干个主成分之和,然后保留方差最大的若干个主成分,而舍弃那些方差较小的。事实上,主成分分析就是对数据的协方差矩阵进行了类似的分解(特征值分解),但这种分解只适用于对称的矩阵,而 SVD 则是对任意大小和形状的矩阵都成立。(SVD 和特征值分解有着非常紧密的联系,此为后话)
我们再回顾一下,主成分分析有什么作用?答曰,降维。换言之,就是用几组低维的主成分来记录原始数据的大部分信息,这也可以认为是一种信息的(有损)压缩。十分赞同 @Tomoya Okazaki的解释
一个矩阵越“奇异”,其越少的奇异值蕴含了更多的矩阵信息,矩阵的信息熵越小(这也符合我们的认知,矩阵越“奇异”,其行(或列)向量彼此越线性相关,越能彼此互相解释,矩阵所携带的信息自然也越少)。
我们用一个图像压缩的例子来说明。我们知道,电脑上的图像(特指位图)都是由像素点组成的,所以存储一张1000×622 大小的图片,实际上就是存储一个1000×622 的矩阵,共622000个元素。这个矩阵用SVD可以分解为622个矩阵之和,如果我们选取其中的前100个之和作为对图像数据的近似,那么只需要存储100个奇异值,100个向量和 100个向量,共计100×(1+1000+622)=162300个元素,大约只有原始的26% 大小。
我们从一个最简单的例子入手。假设我们有如下的一张 15 x 25 的图像数据:
如图所示,该图像主要由下面三部分构成
我们将图像表示成
15 x 25 的矩阵,矩阵的元素对应着图像的不同像素,如果像素是白色的话,就取 1,黑色的就取
0. 我们得到了一个具有375个元素的矩阵,如下图所示
我们可以看出矩阵的秩是3,也就是主要信息都包含在三个列向量里面,这与上面的图像由个条带组成的认知一致。如果我们对矩阵进行奇异值分解以后,得到奇异值分别是
σ1 = 14.72
σ2 = 5.22
σ3 = 3.31
矩阵A就可以表示成
vi具有15个元素,ui具有25个元素,σi对应不同的奇异值。如上图所示,我们就可以用123个元素来表示具有375个元素的图像数据了。
奇异值分解除了以上答主提到的应用以外,还有很多应用。这里在介绍两个:
1.潜在语义索引(Latent Semantic Indexing)
与PCA不太一样,至少不是实现了SVD就可以直接用的,不过LSI也是一个严重依赖于SVD的算法,之前吴军老师在矩阵计算与文本处理中的分类问题中谈到:
“三个矩阵有非常清楚的物理含义。第一个矩阵X中的每一行表示意思相关的一类词,其中的每个非零元素表示这类词中每个词的重要性(或者说相关性),数值越大越相关。最后一个矩阵Y中的每一列表示同一主题一类文章,其中每个元素表示这类文章中每篇文章的相关性。中间的矩阵则表示类词和文章雷之间的相关性。因此,我们只要对关联矩阵A进行一次奇异值分解,w 我们就可以同时完成了近义词分类和文章的分类。(同时得到每类文章和每类词的相关性)。”
上面这段话可能不太容易理解,不过这就是LSI的精髓内容,我下面举一个例子来说明一下,下面的例子来自LSA tutorial,具体的网址我将在最后的引用中给出:
这就是一个矩阵,不过不太一样的是,这里的一行表示一个词在哪些title中出现了(一行就是之前说的一维feature),一列表示一个title中有哪些词,(这个矩阵其实是我们之前说的那种一行是一个sample的形式的一种转置,这个会使得我们的左右奇异向量的意义产生变化,但是不会影响我们计算的过程)。比如说T1这个title中就有guide、investing、market、stock四个词,各出现了一次,我们将这个矩阵进行SVD,得到下面的矩阵:
左奇异向量表示词的一些特性,右奇异向量表示文档的一些特性,中间的奇异值矩阵表示左奇异向量的一行与右奇异向量的一列的重要程序,数字越大越重要。
继续看这个矩阵还可以发现一些有意思的东西,首先,左奇异向量的第一列表示每一个词的出现频繁程度,虽然不是线性的,但是可以认为是一个大概的描述,比如book是0.15对应文档中出现的2次,investing是0.74对应了文档中出现了9次,rich是0.36对应文档中出现了3次;
其次,右奇异向量中的第一行表示每一篇文档中的出现词的个数的近似,比如说,T6是0.49,出现了5个词,T2是0.22,出现了2个词。
然后我们反过头来看,我们可以将左奇异向量和右奇异向量都取后2维(之前是3维的矩阵),投影到一个平面上,可以得到:
在图上,每一个红色的点,都表示一个词,每一个蓝色的点,都表示一篇文档,这样我们可以对这些词和文档进行聚类,比如说stock 和 market可以放在一类,因为他们老是出现在一起,real和estate可以放在一类,dads,guide这种词就看起来有点孤立了,我们就不对他们进行合并了。按这样聚类出现的效果,可以提取文档集合中的近义词,这样当用户检索文档的时候,是用语义级别(近义词集合)去检索了,而不是之前的词的级别。这样一减少我们的检索、存储量,因为这样压缩的文档集合和PCA是异曲同工的,二可以提高我们的用户体验,用户输入一个词,我们可以在这个词的近义词的集合中去找,这是传统的索引无法做到的。
2.数据分析(data
analysis)
我们搜集的数据中总是存在噪声:无论采用的设备多精密,方法有多好,总是会存在一些误差的。如果你们还记得上文提到的,大的奇异值对应了矩阵中的主要信息的话,运用SVD进行数据分析,提取其中的主要部分的话,还是相当合理的。作为例子,假如我们搜集的数据如下所示:
我们将数据用矩阵的形式表示:
经过奇异值分解后,得到
σ1 = 6.04
σ2 = 0.22
由于第一个奇异值远比第二个要大,数据中有包含一些噪声,第二个奇异值在原始矩阵分解相对应的部分可以忽略。经过SVD分解后,保留了主要样本点如图所示
就保留主要样本数据来看,该过程跟PCA( principal component
analysis)技术有一些联系,PCA也使用了SVD去检测数据间依赖和冗余信息.。
--------------------------先更到这里,有时间再更-----------------
更多详细信息可以参考《神奇的矩阵》和《神奇的矩阵第二季》,或者加群了解有关线性代数和矩阵的知识。
参考文献
1.
We recommend a singular value decomposition
2. Singular value decomposition
3. QiuYixuan: 奇异值分解和图像压缩
4. 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用
5. 本文由LeftNotEasy发布于LeftNotEasy - 博客园,部分修改
就如 @lao king 的说法所言:
我感觉,无论是特征值分解还是奇异值分解,都是为了让人们对矩阵(或者线性变换)的作用有一个直观的认识。这是因为我们拿过来一个矩阵,很多情况下只能看到一堆排列有序的数字,而看不到这些数字背后的真实含义,特征值分解和奇异值分解告诉了我们这些数字背后的真实含义,换句话说,它告诉了我们关于矩阵作用的本质信息。
奇异值包含了矩阵的“本质信息”,而具体什么是一个矩阵的“本质信息”呢?这是个很抽象的概念,在不同的应用领域自然有不同的解释,而我将从矩阵本身的角度尽量直观地解释。我认为奇异值分解的结果,解释了矩阵的“奇异程度”。
我们知道非满秩的矩阵就是奇异矩阵,但是有没有量化的标准衡量哪个矩阵更不满秩,或者更奇异呢?比如同样两个满秩矩阵,能否看出哪个更“满”,或者两个非满秩且同为秩r的矩阵,哪个更“奇异”呢?也许你回答不上来,但你心里隐隐约约觉得似乎是有的。让我们来看看下面这两个n=3,r=2的奇异阵:
虽说都是秩2矩阵,但A显得更奇异,因为它似乎离秩1矩阵更接近。如果不是7,而是6.9, 6.5, 6.1, 6.001呢?如果很接近6但不是6的话,理论上A依旧是个秩2矩阵,但也许计算机会告诉你这是一个秩1矩阵了。我们不讨论计算机的精度问题,接着看这两个矩阵。我们对其进行SVD,得到的两个奇异值矩阵:
这是符合我们的认知的,正如在PCA或者图像压缩方面的例子应用一样,的“头部”集中了更多的“质量”,忽略远离“头部”的奇异值对恢复矩阵的影响越小,这意味着:一个矩阵越“奇异”,其越少的奇异值蕴含了更多的矩阵信息,矩阵的信息熵越小(这也符合我们的认知,矩阵越“奇异”,其行(或列)向量彼此越线性相关,越能彼此互相解释,矩阵所携带的信息自然也越少)。这些奇异值就是开头我们所谈论的“本质信息”,而从矩阵中也能得到矩阵的“奇异程度”。
好了,那么你告诉我下面两个波,哪个更奇异呢:
很明显是第一个,这是一个正弦波,第二个是我随意生成的叠加了若干个正弦波的一个波。之后,我采样了3600个点,并将离散信号reshape成了的矩阵,将其SVD分解之后的结果也在我们意料之中(取r=10):
我感觉,无论是特征值分解还是奇异值分解,都是为了让人们对矩阵(或者线性变换)的作用有一个直观的认识。这是因为我们拿过来一个矩阵,很多情况下只能看到一堆排列有序的数字,而看不到这些数字背后的真实含义,特征值分解和奇异值分解告诉了我们这些数字背后的真实含义,换句话说,它告诉了我们关于矩阵作用的本质信息。
奇异值分解的含义是,把一个矩阵A看成线性变换(当然也可以看成是数据矩阵或者样本矩阵),那么这个线性变换的作用效果是这样的,我们可以在原空间找到一组标准正交基V,同时可以在像空间找到一组标准正交基U,我们知道,看一个矩阵的作用效果只要看它在一组基上的作用效果即可,在内积空间上,我们更希望看到它在一组标准正交基上的作用效果。而矩阵A在标准正交基V上的作用效果恰好可以表示为在U的对应方向上只进行纯粹的伸缩!这就大大简化了我们对矩阵作用的认识,因为我们知道,我们面前不管是多么复杂的矩阵,它在某组标准正交基上的作用就是在另外一组标准正交基上进行伸缩而已。
特征分解也是这样的,也可以简化我们对矩阵的认识。对于可对角化的矩阵,该线性变换的作用就是将某些方向(特征向量方向)在该方向上做伸缩。
有了上述认识,当我们要看该矩阵对任一向量x的作用效果的时候,在特征分解的视角下,我们可以把x往特征向量方向上分解,然后每个方向上做伸缩,最后再把结果加起来即可;在奇异值分解的视角下,我们可以把x往V方向上分解,然后将各个分量分别对应到U方向上做伸缩,最后把各个分量上的结果加起来即可。
当我们注意到,不是所有的矩阵都能对角化(对称矩阵总是可以),而所有矩阵总是可以做奇异值分解的。那么多类型的矩阵,我们居然总是可以从一个统一且简单的视角去看它,我们就会感叹奇异值分解是多么奇妙了!其实一句话就可以对奇异值分解所做的工作进行概括,相信你应该学过在平面内用一条直线拟合点的方法,也就是所谓的最小二乘法,那么奇异值分解所做的工作就是将这种方法扩展到高维空间,即寻找一个平面去拟合空间内的点,或者是寻找更高维度的线性子空间去拟合高维点集,唯一与最小二乘法不同的是:最小二乘不要求找到的直线过原点,而奇异值分解要求找到的平面或者更高维线性空间必须过原点(即线性子平面),然而这一差别完全可以先对数据进行中心化而完全消除,X=UDV",在这个分解式子中,X是p*N得矩阵,代表N个p维点,U是p*r,D是r*r,V是N*r,U的前k列(k&<=r)张成的空间就是最佳线性子空间。这就是svd的几何含义。
简单地说,奇异值的意义在于一个m*n的矩阵会把n维空间的单位球映射到m维空间的一个椭球(可能是退化的),而这些奇异值就对应这个椭球的各个半轴长。而奇异向量就恰好是椭球的半轴的方向,以及它们的原像。
参考:Trefethen《数值线性代数》[多图] [有码]
试了下 @郑宁 方法,果然好使
活学活用·数学之美·数学的魔法
换成了RGB图对三个通道分别求SVD再合一起,效果如下
1/369
2/369
3/369
5/369
7/369
369/369
直接放码:
#include &
using namespace cv;
int main(int argc, char** argv) SVD就是你找一个比较好的基,然后把所有的数据都用这些基表示。这样你也能提取一些隐藏的成分。
{
Mat img = imread("./haha.jpg");
if (!img.dims)
{
return -1;
}
int channels = img.channels();
//分离通道
std::vector&
split(img, src);
for (int i = 0; i &< src.size()/*==channels*/; i++)
{
src[i].convertTo(src[i], CV_32F);
}
//SVD
std::vector&
for (int i = 0; i &< channels; i++)
{
Mat w, u, vt;
SVD svd;
svd.compute(src[i], w, u, vt);
W.push_back(w);
U.push_back(u);
VT.push_back(vt);
}
//
Mat s1 = Mat::zeros(W[0].rows, W[0].rows, CV_32F);
Mat s2 = Mat::zeros(W[1].rows, W[1].rows, CV_32F);
Mat s3 = Mat::zeros(W[2].rows, W[2].rows, CV_32F);
S.push_back(s1); S.push_back(s2); S.push_back(s3);
for (int j = 0; j &< img.rows; j++)
{
printf("%d/%d
", j, img.rows);
for (int i = 0; i &< channels; i++)
{
src[i] = Mat::zeros(img.rows, img.cols, CV_32F);
s.at&
src[i] = U[i] * S[i] * VT[i];
src[i].convertTo(src[i], CV_8U);
}
merge(src, img);
imshow("img", img);
//
if (j&
可以参考
http://www.fuzihao.org/blog/2015/12/04/%E7%90%86%E8%A7%A3PCA%E5%92%8CSVD/#more
首先实名反对 @郑宁 的女神女神上野树里(Ueno Juri)
大lena神王道
工程里,用一些比较简单的东西去表达一个复杂的东西,是很有用的。
对应到数学,
比如一个复杂的函数,我们可以用泰勒级数去模拟他,这样泰勒级数前几项,就可以近似当做这个函数的值。
更自然的是三角函数的级数去模拟一个函数, 工具是傅里叶分析。
奇异值就是很好的一个选择。
可以参考:《科学网—奇异值分解(SVD) --- 几何意义》 进行了解。
有两类理解方式
1 线性变换的角度: 注意,任何一个矩阵都对应一个线性变换,反之任何一个线性变换都对应唯一一个矩阵
奇异值分解公式如下:
其中
令代表线性变换, 奇异值分解在原空间与像空间中分别找到一组标准正交基,使得把的第个基向量映射为的第个基向量的非负倍数,并将余下的基向量映射为零向量。即在这两组标准基向量下,M代表的线性变换是最简洁的形式。
2 但是在很多工程应用中,矩阵代表的是存储的数据,并没有明显的线性变换的意义
这时可以从另一个角度理解,数值角度理解
如果我们把奇异值按照从大到小排列,又以知数据M可以(唯一)表示成 ;从数值角度看,我们把 中较小的值置为0,那么 将得到M很好的低秩近似,方便我们对数据进一步处理。所以从工程角度理解,不必牵扯到物理意义,可以直接理解为取数据低秩近似的一种数值算法。或者说,此时的问题不是奇异值分解的物理意义,而应该是为什么所有数据矩阵都可以(唯一)表示成 这种形式?
因为数据样本间是相关联的,而低秩近似就是为了最大化提取数据间的线性相关关系。
PS: 物理意义能帮助人理解,但很多时候过分执着于物理意义也会让人陷入一种思维桎梏中去
PSS:我这里只是举了低秩近似的一个例子,在工程领域有很多其他不同应用,我不太理解,但我感觉这些工程领域都只是利用SVD分解的数学上的性质,根本不需要去深究物理意义。如果硬是要讲物理意义的话,就是当你把某些物理量表达成矩阵的时候,你就可以用SVD去提取其中的线性相关关系,至于线性相关关系到底代表什么,从数学工具角度看并不关心。
奇异值分解,其中的一种理解就是基变换。就是将行空间中的一组正交基变换为一组在列的正交基。A[V1,V2,……Vn]=[U1,U2,……Un],其中[V1,V2,……Vn]是行空间的基向量组,[U1,U2,……Un]是列空间基向量组。[V1,V2,……Vn]如果是标准正交基,则其逆矩阵就是他自身的转置。则就可以得出奇异值分解的形式。
奇异值分解的用途之一是可以用来计算矩阵的秩。那么可以从秩定义的角度来理解奇异值分解的物理意义:所谓矩阵的秩,就是该矩阵的线性独立的列(或行)的极大数目。
线性代数课上介绍了用初等变换(或求矩阵子式)的传统方法来计算矩阵的秩,而用奇异值分解的方法来求矩阵的秩:首先对矩阵M进行奇异值分解,即,其中,就是矩阵M的第i个奇异值;那么矩阵M的秩就是非零奇异值的个数。
可别小看矩阵的秩,在形如A=MxB的运算中(M为算子),若知道了M的秩,你就可以知道输出A的维数大小以及M为方阵时是否可逆等信息。问题的题法有些不恰当。
奇异值是一个数学概念,在不同的物理模型中有不同的物理意义,有时候甚至可以没有明显的意义。在很多答案中提到的图像问题,奇异值大小反映了不同基函数(小波或三角函数)所对应的能量;在声波方程中,不同奇异值可以反应不同频率的planewave能量/振幅。
我的籠統理解是:
A(A為m*n矩陣)的矩陣變換作用是以A^T*A的n個正交特征方向向量作基表示n維空間時,以A^T*A的n個特征值構成的奇異矩陣變換作用在m維空間的投影。而奇異矩陣中的奇異值為該投影到m維空間過程中的最優值。也就是說,上帝在創造多維空間時,它讓不同維度的空間變化都是全力以赴的。
说实话,上面的说了一大堆,还是没清晰的说明物理意义,我个人感觉如果能有机械里涉及的特征值的意义才是物理意义,一个图像你做奇异喜好分解,如果只取前几个奇异值,恢复重建图像到底物理意义是什么?上面举的所有例子都是奇异值的表象,谈不上真正的物理意义,舍去几个奇异值重建对做图像处理的人只能算最普通的工作,这并不是奇异值的物理本质,期待有机械振动的高人来解答下,毕竟特征值在机械振动中有非常具体的物理意义。
推薦閱讀: