Matlab 我应该在应用SVD之前执行数据中心化吗?

Matlab 我应该在应用SVD之前执行数据中心化吗?,matlab,normalization,pca,svd,Matlab,Normalization,Pca,Svd,我必须在Matlab中使用SVD来获得数据的简化版本。 我已经读到函数svds(X,k)执行SVD并返回前k个特征值和特征向量。文档中没有提到是否必须对数据进行规范化。 对于标准化,我指的是平均值的减法和标准偏差的除法 当我实现PCA时,我曾经以这种方式进行规范化。但我知道,在使用matlab函数pca()时不需要它,因为它使用隐式执行归一化的cov()计算协方差矩阵 所以,问题是。我需要的投影矩阵有用,以减少我的n-维数据到k-维的奇异值分解。我是否应该对列车数据执行数据标准化(因此,对进一步

我必须在Matlab中使用SVD来获得数据的简化版本。 我已经读到函数
svds(X,k)
执行SVD并返回前k个特征值和特征向量。文档中没有提到是否必须对数据进行规范化。 对于标准化,我指的是平均值的减法和标准偏差的除法

当我实现PCA时,我曾经以这种方式进行规范化。但我知道,在使用matlab函数
pca()
时不需要它,因为它使用隐式执行归一化的
cov()
计算协方差矩阵

所以,问题是。我需要的投影矩阵有用,以减少我的n-维数据到k-维的奇异值分解。我是否应该对列车数据执行数据标准化(因此,对进一步预测的新数据执行相同的标准化)?
谢谢

这取决于您想对数据做什么。居中和缩放有助于获得代表数据中变化形状的主分量,而与缩放无关。我想说的是,如果你想进一步使用主成分本身,尤其是如果你想将它们可视化,这是最需要的。它还可以帮助分类,因为您的分数将被标准化,这可能有助于您的分类器。然而,这取决于应用程序,因为在某些应用程序中,能量还携带着不应丢弃的有用信息-没有通用的答案

现在你写下你所需要的就是“通过奇异值分解将n维数据简化为k维数据的投影矩阵”。在这种情况下,无需居中或缩放任何对象:

[U,~] = svd(TrainingData);
RecudedData = U(:,k)'*TestData;

我会做好的。当您的培训数据很大(在两个维度上)时,
svd
可能值得考虑,因此
svd
太慢(如果在一个维度上很大,只需将svd应用于gram矩阵)。

基本上,答案是肯定的,您通常应该执行标准化。原因是特征可以有非常不同的缩放,在考虑特征的唯一性时,我们通常不想考虑缩放

假设我们有两个特征x和y,都方差为1,但其中x的平均值为1,y的平均值为1000。然后样本的矩阵将如下所示

n = 500; % samples
x =   1  + randn(n,1);
y = 1000 + randn(n,1);
svd([x,y])
但问题是y的尺度(没有标准化)基本上冲掉了x的微小变化。具体来说,如果我们只检查[x,y]的奇异值,我们可能倾向于说x是y的线性因子(因为其中一个奇异值比另一个小得多)。但实际上,我们知道情况并非如此,因为x是独立生成的

事实上,你经常会发现,一旦我们去掉平均值,你只能在信号中看到“真实”数据。最后,你可以想象我们有一些功能

z = 1e6 + sin(t)
如果有人给了你这些数字,你可以看看序列

z = 1000001.54, 1000001.2, 1000001.4,...

试想,“那个信号很无聊,基本上只是1e6加上一些四舍五入的术语……”。但一旦我们去除了平均值,我们就能看到它的实际信号。。。这确实是一个非常有趣和具体的问题。长话短说,你应该永远删除手段和规模

基本上我有稀疏向量。我想从训练集中“学习”一些投影矩阵,用于缩小训练和测试数据的规模。这些投影向量必须被输入到SVM分类器(当然用于训练和测试)。所以根据你说的,我不需要从序列中减去,然后测试序列向量的平均值。是吗?如果你把它们输入分类器,那么我通常会建议集中并缩放(除非缩放本身是一个相关的功能,但这取决于你的数据,我们对此一无所知)。这将消除特征缩放的影响,这有助于稳定SVM。请参见不来梅·马特的回复,他对这方面做了很好的解释。通过使用svds(),U的维度将me作为k的训练数据数!出现了一些问题,因为它无法将测试数据从1×n向量转换为1×k向量。因此,缺少转置。按照我写这篇文章的方式,我希望培训数据是列。如果是行,则需要对其进行转置。