我应该在应用SVD之前执行数据居中吗?

时间:2017-02-03 12:48:23

标签: matlab normalization pca svd

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

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

所以,问题是。我需要投影矩阵用于通过SVD将我的n-dim数据减少到k-dim数据。我是否应该对列车数据进行数据标准化(因此,对进一步预测的新数据进行相同的标准化)? 感谢

2 个答案:

答案 0 :(得分:2)

基本上,答案是肯定的,您通常应该执行规范化。原因是功能可以具有非常不同的缩放,并且我们通常不希望在考虑特征的唯一性时考虑缩放。

假设我们有两个特征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加上一些圆整的条款......"。但是一旦我们删除了平均值,我们就会看到它实际上是什么的信号......确实是一个非常有趣和具体的信号。长话短说,你应该总是删除手段和规模。

答案 1 :(得分:1)

这实际上取决于您对数据的处理方式。中心和缩放有助于获得代表数据变化形状的原理组件,而与缩放无关。我想说如果你想进一步使用主要组件本身,特别是如果你想要将它们可视化,那么它主要是需要的。它也可以在分类期间提供帮助,因为您的分数将被标准化,这可能有助于您的分类器。但是,它取决于应用程序,因为在某些应用程序中,能量还带有一个不应该丢弃的有用信息 - 没有一般答案!

现在你写道,你所需要的只是"投影矩阵可用于通过SVD"将我的n-dim数据减少到k-dim数据。在这种情况下,无需居中或扩展任何东西:

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

将完成这项工作。当您的TrainingData很大(两个维度)时,svds可能值得考虑,因此svd太慢(如果它在一个维度上很大,只需将svd应用于克矩阵)。