我必须在Matlab中使用SVD来获取我的数据的简化版本。
我已经读过函数svds(X,k)
执行SVD并返回前k个特征值和特征向量。文档中没有提及数据是否必须标准化。
归一化,我指的是平均值的减法和除以标准差。
当我实施PCA时,我曾经以这种方式进行规范化。但我知道在使用matlab函数pca()
时不需要它,因为它使用隐式执行规范化的cov()
来计算协方差矩阵。
所以,问题是。我需要投影矩阵用于通过SVD将我的n-dim数据减少到k-dim数据。我是否应该对列车数据进行数据标准化(因此,对进一步预测的新数据进行相同的标准化)? 感谢
答案 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应用于克矩阵)。