使用Matlab函数计算SVD

时间:2014-05-12 01:22:58

标签: matlab svd

我对SVD有疑问。在我读过的文献中,我们首先要将输入矩阵转换为协方差矩阵,然后使用matlab的SVD函数( SVD )。

但是,在Mathworks网站中我们可以直接将SVD函数用于输入矩阵(无需将其转换为协方差矩阵)。

   [U,S,V]=svd(inImageD);
  1. 哪一个是真的??

  2. 如果我们想要降维,我们必须将数据投影到特征向量中。但是由SVD函数生成的特征向量在哪里。 我知道S是本征值..但是什么是U和S ??

  3. 为了减少我们的数据维度,我们是否需要用其均值减去输入矩阵,然后将其与特征向量相乘?或者我们可以将输入矩阵与特征向量相乘(不需要先用它的均值减去它)。


  4. 修改

    假设我想使用SIFT作为特征并使用SVM作为分类器进行分类。

    我有10张用于训练的图像,我将它们安排在不同的行中。

    第一张图像的第一行,第二张图像的第二行等等......

    Feat=[1 2 5 6 7   >> Images1
          2 9 0 6 5   >> Images2
          3 4 7 8 2   >> Images3
          2 3 6 3 1   >> Images4
          ..
          .
          so on. . ]
    

    为了减少维数(来自我的 10x5 矩阵),我们可以做 A * EigenVector

    根据你所解释的(@Sam Roberts),我可以使用协方差矩阵中的 EIGS 函数来计算它(而不是使用SVD函数)。

    当我安排不同行中的图像专长时,我需要做 A'* A 所以它变成了:

     Matrix=A'*A
     MAT_Cov=Cov(Matrix)
     [EigVector EigValue] = eigs (MAT_Cov);
    

    是吗?

1 个答案:

答案 0 :(得分:4)

特征向量分解(EVD)和奇异值分解(SVD)密切相关。

假设您有一些数据a = rand(3,4);。请注意,这不是方形矩阵 - 它表示观察(行)和变量(列)的数据集。

执行以下操作:

[u1,s1,v1] = svd(a);
[u2,s2,v2] = svd(a');
[e1,d1] = eig(a*a');
[e2,d2] = eig(a'*a);

现在请注意一些事情。

  1. 直到符号(+/-),这是任意的,u1v2相同。直到符号和列的排序,它们也等于e1。 (请注意,由于svdeig算法存在细微差别,因此可能存在一些非常微小的数值差异。
  2. 同样,u2v1e2相同。
  3. s1等于s2,除了一些额外的列和行零之外,它们都等于sqrt(d1)sqrt(d2)。同样,由于算法问题,可能存在一些非常小的数值差异(它们将大约为-10左右)。
  4. 另请注意,a*a'基本上是行的协方差,a'*a基本上是列的协方差(这不完全正确 - a需要首先居中减去列或行意味着它们相等,并且可能存在乘法常数差异,但它基本上非常相似)。

    现在回答你的问题,我认为你真正想做的就是PCA。您可以通过获取原始数据矩阵并通过采用其协方差矩阵和应用EVD应用SVD,来执行PCA 。请注意,统计工具箱有两个PCA功能 - pca(旧版本princomp)和pcacov

    由于SVD和EVD之间的上述等价,两者基本上都是相同的,但是从不同的起点开始。

    严格来说,上面的u1v1u2v2 不是特征向量,它们是奇异向量 - 而{{1 }和s1是奇异值。它们是矩阵s2的奇异向量/值。 ae1d1(非a*a')的特征向量和特征值,而ae2d2a'*a的特征向量和特征值{1}}(不是a)。 a没有任何特征向量 - 只有方形矩阵具有特征向量。

    通过减去平均值来居中是一个单独的问题 - 您通常会在PCA之前执行此操作,但有些情况下您可能不希望这样做。您可能还希望通过除以标准偏差进行标准化,但又一次,您并不总是希望 - 这取决于数据代表什么以及您尝试回答的问题。