我对SVD有疑问。在我读过的文献中,我们首先要将输入矩阵转换为协方差矩阵,然后使用matlab的SVD函数( SVD )。
但是,在Mathworks网站中我们可以直接将SVD函数用于输入矩阵(无需将其转换为协方差矩阵)。
[U,S,V]=svd(inImageD);
哪一个是真的??
如果我们想要降维,我们必须将数据投影到特征向量中。但是由SVD函数生成的特征向量在哪里。 我知道S是本征值..但是什么是U和S ??
为了减少我们的数据维度,我们是否需要用其均值减去输入矩阵,然后将其与特征向量相乘?或者我们可以将输入矩阵与特征向量相乘(不需要先用它的均值减去它)。
修改
假设我想使用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);
是吗?
答案 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);
现在请注意一些事情。
u1
与v2
相同。直到符号和列的排序,它们也等于e1
。 (请注意,由于svd
和eig
算法存在细微差别,因此可能存在一些非常微小的数值差异。u2
与v1
和e2
相同。s1
等于s2
,除了一些额外的列和行零之外,它们都等于sqrt(d1)
和sqrt(d2)
。同样,由于算法问题,可能存在一些非常小的数值差异(它们将大约为-10左右)。另请注意,a*a'
基本上是行的协方差,a'*a
基本上是列的协方差(这不完全正确 - a
需要首先居中减去列或行意味着它们相等,并且可能存在乘法常数差异,但它基本上非常相似)。
现在回答你的问题,我认为你真正想做的就是PCA。您可以通过获取原始数据矩阵并通过采用其协方差矩阵和应用EVD应用SVD,或来执行PCA 。请注意,统计工具箱有两个PCA功能 - pca
(旧版本princomp
)和pcacov
。
由于SVD和EVD之间的上述等价,两者基本上都是相同的,但是从不同的起点开始。
严格来说,上面的u1
,v1
,u2
和v2
不是特征向量,它们是奇异向量 - 而{{1 }和s1
是奇异值。它们是矩阵s2
的奇异向量/值。 a
和e1
是d1
(非a*a'
)的特征向量和特征值,而a
和e2
是d2
和a'*a
的特征向量和特征值{1}}(不是a
)。 a
没有任何特征向量 - 只有方形矩阵具有特征向量。
通过减去平均值来居中是一个单独的问题 - 您通常会在PCA之前执行此操作,但有些情况下您可能不希望这样做。您可能还希望通过除以标准偏差进行标准化,但又一次,您并不总是希望 - 这取决于数据代表什么以及您尝试回答的问题。