matlabsvd提取特征值_MATLAB中的SVD函数

转贴

奇异值分解 (sigular value decomposition,SVD) 是另一种正交矩阵分解法;SVD是最可靠的分解法,但是它比QR

分解法要花上近十倍的计算时间。[U,S,V]=svd(A),其中U和V代表二个相互正交矩阵,而S代表一对角矩阵。 和QR分解法相同者,

原矩阵A不必为正方矩阵。

使用SVD分解法的用途是解最小平方误差法和数据压缩

s = svd(X)

[U,S,V] = svd(X)

[U,S,V] = svd(X,0)

[U,S,V] = svd(X,'econ')

描述:

SVD命令是为了计算矩阵的奇异值分解。

s = svd(X) 返回一个向量的奇异值.

[U,S,V] = svd(X)

产生一个与X维度相同的对角矩阵S,并且降序排列非负对角元素。并且酉矩阵U和V使得X = U*S*V

[U,S,V] = svd(X,0)

如果X是n和m并且m > n,那么奇异值分解计算只有第一个n列U和S是n,n

[U,S,V] = svd(X,'econ')

如果X是n和m并且m > n,等价于svd(X,0)

对于m < n, 只有V的第一个m列是被计算的并且S是m*m.

X = diag(v,k)

以向量v的元素作为矩阵X的第k条对角线元素,当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。

例:

>> v=[1 2 3];

>> x=diag(v,-1)

x =

0 0 0 0

1 0 0 0

0 2 0 0

0 0 3 0

>> v(2:5)=2;(2到5列均赋值为2)

>> x=diag(v,-1)

x =

0 0 0 0 0 0

1 0 0 0 0 0

0 2 0 0 0 0

0 0 2 0 0 0

0 0 0 2 0 0

0 0 0 0 2 0

设A为m*n阶矩阵,A'表示A的转置矩阵,A'*A的n个特征值的非负平方根叫作A的奇异值。记为σi(A)。

这几天做实验涉及到奇异值分解svd(singular value decomposition),涉及到这样的一个问题,

做PCA时候400幅图像拉成向量按列摆放,结果摆成了比如说10000*400大小的矩阵,

用到svd函数进行奇异值分解找主分量,结果MATLAB提示超出内存,后来想起还有个函数叫svds,看到别人用过,以为只是一个变体,没什么区别,就用上了,结果确实在预料之中。但是今天觉得不放心,跑到变量里面看了下,发现这个大的矩阵被分解成了

三个10000*6,6*6,400*6大小的矩阵的乘积,而不是普通的svd分解得到的10000*10000,10000*400,400*400大小的矩阵乘积,把我吓了一跳,都得到预期的结果,难不成这里还出个篓子?赶紧试验,

发现任给一个M*N大小的矩阵,都是被分解成了M*6,6*6,N*6大小的矩阵的乘积,为什么都会出现6呢?确实很纳闷。help

svds看了一下,发现SVDS(A)

返回的就是svds返回的就是最大的6个特征值及其对应的特征行向量和特征列向量,

还好,我们实验中是在svds得到列向量中再取前5个最大的列向量,这个与普通的svd得到的结果是一致的,虚惊一场。。。还得到了一些别的,比如

改变这个默认的设置,

比如用[u,d,v]=svds(A,10)将得到最大的10个特征值及其对应的最大特征行向量和特征列向量,

[u,d,v]=svds(A,10,0)将得到最小的10个特征值及其对应的特征行向量和特征列向量,

[u,d,v]=svds(A,10,2)将得到与2最接近的10个特征值及其对应的特征行向量和特征列向量。

总之,相比svd,svds的可定制性更强。

奇异值分解非常有用,对于矩阵A(m*n),存在U(m*m),V(n*n),S(m*n),满足A = U*S*V’。

U和V中分别是A的奇异向量,而S是A的奇异值。

AA'的正交单位特征向量组成U,特征值组成S'S,

A'A的正交单位特征向量组成V,特征值(与AA'相同)组成SS'。因此,奇异值分解和特征值问题紧密联系


版权声明:本文为weixin_39598954原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。