使用SVD获取降维后的特征矩阵

5
我正在使用R中的SVD软件包,通过将最低奇异值替换为0,我能够降低矩阵的维度。但是,当我重新组合矩阵时,仍然有相同数量的特征。我找不到一种有效的方法来删除源矩阵中最无用的特征,以减少其列数。

例如,目前我正在执行以下操作:

这是我的源矩阵A:

  A B C D
1 7 6 1 6
2 4 8 2 4
3 2 3 2 3
4 2 3 1 3

如果我执行以下操作:
s = svd(A)
s$d[3:4] = 0  # Replacement of the 2 smallest singular values by 0
A' = s$u %*% diag(s$d)  %*% t(s$v)

我得到了A',它具有相同的尺寸(4x4),仅使用2个“组件”进行重构,并且是A的近似(包含较少的信息,可能有更少的噪音等):
      [,1]     [,2]      [,3]     [,4]
1 6.871009 5.887558 1.1791440 6.215131
2 3.799792 7.779251 2.3862880 4.357163
3 2.289294 3.512959 0.9876354 2.386322
4 2.408818 3.181448 0.8417837 2.406172

我需要的是一个子矩阵,它的列较少,但可以重现不同行之间的距离,类似于这样(使用PCA得到,我们称之为A''):
        PC1        PC2
1 -3.588727  1.7125360
2 -2.065012 -2.2465708
3  2.838545  0.1377343   # The similarity between rows 3 
4  2.815194  0.3963005   # and 4 in A is conserved in A''

这里是使用PCA获取A''指标的代码:
p = prcomp(A)
A'' = p$x[,1:2]

最终目标是减少列的数量,以加快对大型数据集进行聚类算法的处理速度。
如果有人能指导我,提前感谢您 :)

你应该构建一个示例矩阵,其中一些小的特征值被设置为0,以帮助展示你想要实现的目标以及使用“svd”方法得到的结果。否则,你会强迫每个试图回答这个问题的人都去做这件事。 - Matthew Lundberg
你好,Matthew,我编辑了我的问题,现在有一个具体的例子。 - ClydeX
1个回答

0
我会看一下这个降维章节或者这个交叉验证问题。核心思想是通过使用更少的信息可以重构整个数据集。不同于PCA,你可能只选择保留10个主成分中的2个。
当你进行上述修剪时,实际上只是去除了数据中的一些“噪音”。数据仍然具有相同的维度。

你好,MrFlick先生, 感谢您的回复。确实,在我所做的事情和您提到的页面中,一个人正在使用相同大小但信息较少的矩阵进行重构。但是我想知道的是,是否有一种方法可以从源矩阵创建一个子矩阵,该子矩阵具有较少的列,并使用SVD重现原始矩阵中行之间的距离? - ClydeX
@ClydeX 我找不到任何相关的例子。你认为它应该那样工作,有什么原因吗? - MrFlick
唯一的原因是PCA使用SVD,因此应该可以根据SVD输出手动进行因子分析。这个想法是为了更好地理解SVD和PCA之间的联系。 - ClydeX
如果想更好地理解统计方法,那么这并不是一个具体的编程问题。你可以在http://stats.stackexchange.com/上提问,或许会有更好的运气。 - MrFlick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接