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

brqmpdu1  于 2022-11-15  发布在  Matlab
关注(0)|答案(3)|浏览(242)

我必须使用MatLab中的奇异值分解来获得我的数据的简化版本。我读到过函数svds(X,k)执行奇异值分解并返回前k个特征值和特征向量。文档中没有提到是否必须对数据进行标准化。对于归一化,我指的是平均值的减法和标准差的除法。
当我实现PCA时,我习惯于这样正常化。但我知道在使用matlab函数pca()时不需要它,因为它通过使用cov()计算协方差矩阵,cov()隐式执行归一化。
所以,问题是。我需要通过奇异值分解将n维数据简化为k维数据的投影矩阵。我是否应该对列车数据执行数据标准化(因此,对进一步预测的新数据也执行相同的标准化)?谢谢

cld4siwp

cld4siwp1#

基本上,答案是肯定的,您通常应该执行标准化。原因是,功能可以具有非常不同的比例,而我们通常不希望在考虑功能的唯一性时考虑比例。
假设我们有两个特征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加上一些四舍五入的项……”但一旦我们去掉平均值,我们就能看到它实际是什么的信号。确实是一个非常有趣和具体的问题。长话短说,你应该总是去掉手段和规模。

g6ll5ycj

g6ll5ycj2#

这真的取决于你想要如何处理你的数据。居中和缩放有助于获得代表数据中变化的形状的主要分量,而与缩放无关。我会说,如果您想要进一步使用主组件本身,尤其是如果您想要可视化它们,它是最需要的。它还可以在分类过程中提供帮助,因为您的分数将被归一化,这可能有助于您的分类器。然而,这取决于应用程序,因为在一些应用程序中,能量也携带着人们不应该丢弃的有用信息--没有通用的答案!
现在,您所需要的只是“用于通过奇异值分解将n维数据减少到k维数据的投影矩阵”。在这种情况下,不需要居中或缩放任何内容:

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

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

t8e9dugd

t8e9dugd3#

视情况而定!
在信号处理中,归一化没有意义的一个常见用途是通过相关信号的降维来降低噪声,其中所有的恐惧都与具有相同方差的随机高斯噪声重叠。在这种情况下,如果某个特征的大小是它的两倍,那么它的SNR也大约是两倍,所以归一化特征是没有意义的,因为它只会使SNR较差的部分更大,而SNR较好的部分更小。在这种情况下,你也不需要减去平均值(就像在主成分分析中一样),平均值(或DC)与任何其他频率没有什么不同。

相关问题