https://www.zhihu.com/question/22237507
矩阵的奇异值是一个数学意义上的概念,一般是由奇异值分解(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;
% 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) '\n']);
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是一个重要的方法。
在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做featurereduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层次检索的LSI(LatentSemantic Indexing)。
SVD的过程不是很好理解,因为它不够直观,但它对矩阵分解的效果却非常好。比如,Netflix(一个提供在线电影租赁的公司)曾经就悬赏100万美金,如果谁能提高它的电影推荐系统评分预测准确率提高10%的话。令人惊讶的是,这个目标充满了挑战,来自世界各地的团队运用了各种不同的技术。最终的获胜队伍"BellKor'sPragmatic Chaos"采用的核心算法就是基于SVD。
SVD提供了一种非常便捷的矩阵分解方式,能够发现数据中十分有意思的潜在模式。在这篇文章中,我们将会提供对SVD几何上的理解和一些简单的应用实例。首先从几何层面上去理解二维的SVD:
这个式子有什么用呢?注意到,我们假定是按降序排列的,它在某种程度上反映了对应项Mi在A中的“贡献”。越大,说明对应的Mi在A的分解中占据的比重也越大。所以一个很自然的想法是,我们是不是可以提取出Mi中那些对A贡献最大的项,把它们的和作为对A的近似?
答案是肯定的,不过等一下,这个想法好像似曾相识?对了,多元统计分析中经典的主成分分析就是这样做的。在主成分分析中,我们把数据整体的变异分解成若干个主成分之和,然后保留方差最大的若干个主成分,而舍弃那些方差较小的。事实上,主成分分析就是对数据的协方差矩阵进行了类似的分解(特征值分解),但这种分解只适用于对称的矩阵,而 SVD 则是对任意大小和形状的矩阵都成立。(SVD 和特征值分解有着非常紧密的联系,此为后话)
我们再回顾一下,主成分分析有什么作用?答曰,降维。换言之,就是用几组低维的主成分来记录原始数据的大部分信息,这也可以认为是一种信息的(有损)压缩。十分赞同
一个矩阵越“奇异”,其越少的奇异值蕴含了更多的矩阵信息,矩阵的信息熵越小(这也符合我们的认知,矩阵越“奇异”,其行(或列)向量彼此越线性相关,越能彼此互相解释,矩阵所携带的信息自然也越少)。
我们用一个图像压缩的例子来说明。我们知道,电脑上的图像(特指位图)都是由像素点组成的,所以存储一张1000×622 大小的图片,实际上就是存储一个1000×622 的矩阵,共622000个元素。这个矩阵用SVD可以分解为622个矩阵之和,如果我们选取其中的前100个之和作为对图像数据的近似,那么只需要存储100个奇异值,100个向量和 100个向量,共计100×(1+1000+622)=162300个元素,大约只有原始的26% 大小。
我们将图像表示成15 x 25 的矩阵,矩阵的元素对应着图像的不同像素,如果像素是白色的话,就取 1,黑色的就取0. 我们得到了一个具有375个元素的矩阵,如下图所示
我们可以看出矩阵的秩是3,也就是主要信息都包含在三个列向量里面,这与上面的图像由个条带组成的认知一致。如果我们对矩阵进行奇异值分解以后,得到奇异值分别是
σ1 = 14.72
σ2 = 5.22
σ3 = 3.31
“三个矩阵有非常清楚的物理含义。第一个矩阵X中的每一行表示意思相关的一类词,其中的每个非零元素表示这类词中每个词的重要性(或者说相关性),数值越大越相关。最后一个矩阵Y中的每一列表示同一主题一类文章,其中每个元素表示这类文章中每篇文章的相关性。中间的矩阵则表示类词和文章雷之间的相关性。因此,我们只要对关联矩阵A进行一次奇异值分解,w 我们就可以同时完成了近义词分类和文章的分类。(同时得到每类文章和每类词的相关性)。”
左奇异向量表示词的一些特性,右奇异向量表示文档的一些特性,中间的奇异值矩阵表示左奇异向量的一行与右奇异向量的一列的重要程序,数字越大越重要。
继续看这个矩阵还可以发现一些有意思的东西,首先,左奇异向量的第一列表示每一个词的出现频繁程度,虽然不是线性的,但是可以认为是一个大概的描述,比如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.数据分析(dataanalysis)
我们搜集的数据中总是存在噪声:无论采用的设备多精密,方法有多好,总是会存在一些误差的。如果你们还记得上文提到的,大的奇异值对应了矩阵中的主要信息的话,运用SVD进行数据分析,提取其中的主要部分的话,还是相当合理的。作为例子,假如我们搜集的数据如下所示:
我们将数据用矩阵的形式表示:
经过奇异值分解后,得到
σ1 = 6.04
σ2 = 0.22
由于第一个奇异值远比第二个要大,数据中有包含一些噪声,第二个奇异值在原始矩阵分解相对应的部分可以忽略。经过SVD分解后,保留了主要样本点如图所示
就保留主要样本数据来看,该过程跟PCA( principal componentanalysis)技术有一些联系,PCA也使用了SVD去检测数据间依赖和冗余信息.。
参考文献
1.We recommend a singular value decomposition
2. Singular value decomposition
3. QiuYixuan: 奇异值分解和图像压缩
4. 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用
5. 本文由LeftNotEasy发布于LeftNotEasy - 博客园,部分修改
我感觉,无论是特征值分解还是奇异值分解,都是为了让人们对矩阵(或者线性变换)的作用有一个直观的认识。这是因为我们拿过来一个矩阵,很多情况下只能看到一堆排列有序的数字,而看不到这些数字背后的真实含义,特征值分解和奇异值分解告诉了我们这些数字背后的真实含义,换句话说,它告诉了我们关于矩阵作用的本质信息。
奇异值包含了矩阵的“本质信息”,而具体什么是一个矩阵的“本质信息”呢?这是个很抽象的概念,在不同的应用领域自然有不同的解释,而我将从矩阵本身的角度尽量直观地解释。我认为奇异值分解的结果,解释了矩阵的“奇异程度”。
我们知道非满秩的矩阵就是奇异矩阵,但是有没有量化的标准衡量哪个矩阵更不满秩,或者更奇异呢?比如同样两个满秩矩阵,能否看出哪个更“满”,或者两个非满秩且同为秩r的矩阵,哪个更“奇异”呢?也许你回答不上来,但你心里隐隐约约觉得似乎是有的。让我们来看看下面这两个n=3,r=2的奇异阵:
虽说都是秩2矩阵,但A显得更奇异,因为它似乎离秩1矩阵更接近。如果不是7,而是6.9, 6.5, 6.1, 6.001呢?如果很接近6但不是6的话,理论上A依旧是个秩2矩阵,但也许计算机会告诉你这是一个秩1矩阵了。我们不讨论计算机的精度问题,接着看这两个矩阵。我们对其进行SVD,得到的两个奇异值矩阵:
这是符合我们的认知的,正如在PCA或者图像压缩方面的例子应用一样,的“头部”集中了更多的“质量”,忽略远离“头部”的奇异值对恢复矩阵的影响越小,这意味着:一个矩阵越“奇异”,其越少的奇异值蕴含了更多的矩阵信息,矩阵的信息熵越小(这也符合我们的认知,矩阵越“奇异”,其行(或列)向量彼此越线性相关,越能彼此互相解释,矩阵所携带的信息自然也越少)。这些奇异值就是开头我们所谈论的“本质信息”,而从矩阵中也能得到矩阵的“奇异程度”。
好了,那么你告诉我下面两个波,哪个更奇异呢:
#include
using namespace cv;
int main(int argc, char** argv)
{
Mat img = imread("./haha.jpg");
if (!img.dims)
{
return -1;
}
int channels = img.channels();
//分离通道
std::vector src;
split(img, src);
for (int i = 0; i < src.size()/*==channels*/; i++)
{
src[i].convertTo(src[i], CV_32F);
}
//SVD
std::vectorW, U, VT,S;
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\n", j, img.rows);
for (int i = 0; i < channels; i++)
{
src[i] = Mat::zeros(img.rows, img.cols, CV_32F);
s.at(j, j) = W[i].at(j);
src[i] = U[i] * S[i] * VT[i];
src[i].convertTo(src[i], CV_8U);
}
merge(src, img);
imshow("img", img);
//
if (j
我感觉,无论是特征值分解还是奇异值分解,都是为了让人们对矩阵(或者线性变换)的作用有一个直观的认识。这是因为我们拿过来一个矩阵,很多情况下只能看到一堆排列有序的数字,而看不到这些数字背后的真实含义,特征值分解和奇异值分解告诉了我们这些数字背后的真实含义,换句话说,它告诉了我们关于矩阵作用的本质信息。
奇异值分解的含义是,把一个矩阵A看成线性变换(当然也可以看成是数据矩阵或者样本矩阵),那么这个线性变换的作用效果是这样的,我们可以在原空间找到一组标准正交基V,同时可以在像空间找到一组标准正交基U,我们知道,看一个矩阵的作用效果只要看它在一组基上的作用效果即可,在内积空间上,我们更希望看到它在一组标准正交基上的作用效果。而矩阵A在标准正交基V上的作用效果恰好可以表示为在U的对应方向上只进行纯粹的伸缩!这就大大简化了我们对矩阵作用的认识,因为我们知道,我们面前不管是多么复杂的矩阵,它在某组标准正交基上的作用就是在另外一组标准正交基上进行伸缩而已。
特征分解也是这样的,也可以简化我们对矩阵的认识。对于可对角化的矩阵,该线性变换的作用就是将某些方向(特征向量方向)在该方向上做伸缩。
有了上述认识,当我们要看该矩阵对任一向量x的作用效果的时候,在特征分解的视角下,我们可以把x往特征向量方向上分解,然后每个方向上做伸缩,最后再把结果加起来即可;在奇异值分解的视角下,我们可以把x往V方向上分解,然后将各个分量分别对应到U方向上做伸缩,最后把各个分量上的结果加起来即可。
当我们注意到,不是所有的矩阵都能对角化(对称矩阵总是可以),而所有矩阵总是可以做奇异值分解的。那么多类型的矩阵,我们居然总是可以从一个统一且简单的视角去看它,我们就会感叹奇异值分解是多么奇妙了!简单地说,奇异值的意义在于一个m*n的矩阵会把n维空间的单位球映射到m维空间的一个椭球(可能是退化的),而这些奇异值就对应这个椭球的各个半轴长。而奇异向量就恰好是椭球的半轴的方向,以及它们的原像。
参考:Trefethen《数值线性代数》SVD就是你找一个比较好的基,然后把所有的数据都用这些基表示。这样你也能提取一些隐藏的成分。
可以参考
http://www.fuzihao.org/blog/2015/12/04/%E7%90%86%E8%A7%A3PCA%E5%92%8CSVD/#more
有两类理解方式
1 线性变换的角度: 注意,任何一个矩阵都对应一个线性变换,反之任何一个线性变换都对应唯一一个矩阵
奇异值分解公式如下:
其中
令代表线性变换, 奇异值分解在原空间与像空间中分别找到一组标准正交基,使得把的第个基向量映射为的第个基向量的非负倍数,并将余下的基向量映射为零向量。即在这两组标准基向量下,M代表的线性变换是最简洁的形式。
2 但是在很多工程应用中,矩阵代表的是存储的数据,并没有明显的线性变换的意义
这时可以从另一个角度理解,数值角度理解
如果我们把奇异值按照从大到小排列,又以知数据M可以(唯一)表示成 ;从数值角度看,我们把 中较小的值置为0,那么 将得到M很好的低秩近似,方便我们对数据进一步处理。所以从工程角度理解,不必牵扯到物理意义,可以直接理解为取数据低秩近似的一种数值算法。或者说,此时的问题不是奇异值分解的物理意义,而应该是为什么所有数据矩阵都可以(唯一)表示成 这种形式?
奇异值分解的用途之一是可以用来计算矩阵的秩。那么可以从秩定义的角度来理解奇异值分解的物理意义:所谓矩阵的秩,就是该矩阵的线性独立的列(或行)的极大数目。
线性代数课上介绍了用初等变换(或求矩阵子式)的传统方法来计算矩阵的秩,而用奇异值分解的方法来求矩阵的秩:首先对矩阵M进行奇异值分解,即,其中,就是矩阵M的第i个奇异值;那么矩阵M的秩就是非零奇异值的个数。
可别小看矩阵的秩,在形如A=MxB的运算中(M为算子),若知道了M的秩,你就可以知道输出A的维数大小以及M为方阵时是否可逆等信息。一个m*n的矩阵是一个n维线性空间到一个m维线性空间的一个线性映射,而m维线性空间内是天然有一个二范数的(自然基下的坐标平方和)。那么这个线性映射在原来的n维线性空间上就诱导了一个半正定二次型,利用shimidt正交化可以在n维空间中取出一组标准正交基底使得这个半正定二次型对角化。
几何意义则是说,你可以在n维空间中找出来一组标准正交基,使得他们在象空间的那个m维空间中是彼此正交的(当然,有一些的象会是0向量),而这组标准正交基中每个基向量被伸长的倍数就是奇异值。
SVD分解,类似于信号功率谱分析,都是一种将信号按照特征来分解的方法,即是按照信号固有的分布去展开。
时域信号x(t)可以通过傅里叶变换展开到频域里去。傅里叶变换的基函数为exp(jwt),这是一个单位正交的基函数,傅里叶变换结果中的幅度就是信号在单位正交基函数上投影的模长,因此,幅度即对应SVD分解中的特征值,基函数就是其对应的特征向量。将信号转换成频域信号,可以揭示一些系统的结构特征,比如固有频率、模态。因此,傅里叶变换可以理解为将信号按照其固有的频率分布去展开。
对于一些空间分布的信号,我们可以按照其空间的固有的分布形式将其展开,比如说常见的PCA主成分析,比如一个椭圆面分布的二维数据集,可以沿着椭圆俩主轴的方向将其分解开来,当然,PCA可以看成SVD的一种封装,因此不难理解SVD也是将数据按其固有的空间分布去展开的一种手段。奇异值大小即表征分布的强弱,奇异向量即为其对应的空间分布的“方向”。
舍去几个小的奇异值来降噪可以看成将空间分布比较弱的信号剔除的过程。
问题的题法有些不恰当。
奇异值是一个数学概念,在不同的物理模型中有不同的物理意义,有时候甚至可以没有明显的意义。在很多答案中提到的图像问题,奇异值大小反映了不同基函数(小波或三角函数)所对应的能量;在声波方程中,不同奇异值可以反应不同频率的planewave能量/振幅。
我的籠統理解是:
A(A為m*n矩陣)的矩陣變換作用是以A^T*A的n個正交特征方向向量作基表示n維空間時,以A^T*A的n個特征值構成的奇異矩陣變換作用在m維空間的投影。而奇異矩陣中的奇異值為該投影到m維空間過程中的最優值。也就是說,上帝在創造多維空間時,它讓不同維度的空間變化都是全力以赴的。