如何使用 SVD 进行降维以减少数据矩阵的列数(特征)?

机器算法验证 主成分分析 降维 svd
2022-02-16 13:55:27

我的原始数据的列(特征)比行(用户)多得多。我正在尝试减少我的 SVD 的功能(我需要所有的行)。我在一本名为“Machine Learning in Action”的书中找到了一种这样做的方法,但我认为它不适用于我正在使用的数据。

方法如下。定义 SVD 为

A=USV.

设置优化阈值(即 90%)。计算对角线平方的总和S矩阵。计算有多少S达到总平方和的 90% 所需的值。所以如果结果是 100S值,然后我会取的前 100 列U矩阵,前 100 行V矩阵和一个100×100方阵出S矩阵。然后我会计算A=USV使用简化矩阵。

但是,此方法不针对我的原始数据的列,因为结果的维度A矩阵与之前相同。我将如何定位原始矩阵的列?

2个回答

@davidhigh 写的是正确的:如果你乘以简化版本Ur,Sr, 和Vr,正如您在问题中描述的那样,您将获得一个矩阵

A~=UrSrVr
具有与以前完全相同的尺寸,但降低了 rank

但是,@davidhigh 没有添加的是,您可以通过将简化版本相乘来获得您想要的UrSr仅,即计算

B=UrSr.
这个矩阵只有(在你的例子中)100列,但行数与A. 矩阵V仅用于将数据从这个缩减的 100 维空间映射到您的原始数据p维空间。如果您不需要将其映射回来,请离开V出来了,你就完了。

顺便说一下,矩阵的列B将包含所谓的数据的主要成分

您似乎并不完全了解 SVD 的作用。正如您所写,它分解了一个矩阵A根据

A=USVT,

阅读有关矩阵维度和属性的详细信息,例如此处

现在,通过忽略对角矩阵中的小奇异值来进行降维S. 无论您将多少奇异值近似设置为零,生成的矩阵A始终保持其原始尺寸。特别是,您不会删除任何行或列。

因此,降维的特性只在分解版本中被利用。例如考虑一个秩为 1 的非常大的矩阵,即列/行向量仅跨越一维子空间。对于此矩阵,您将仅获得一个非零奇异值。现在,除了存储这个大矩阵,还可以存储两个向量和一个实数,这相当于减少了一个数量级。