R - 使用SVD获得具有减少的特征数量的矩阵

时间:2014-05-23 01:16:20

标签: r feature-extraction svd dimensionality-reduction matrix-factorization

我正在使用带有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]

最终目标是减少列数,以加快大型数据集上的聚类算法。

如果有人可以指导我,请提前感谢您:)

1 个答案:

答案 0 :(得分:0)

我会查看this chapter on dimensionality reductionthis cross-validated question。这个想法是可以使用更少的信息重建整个数据集。从某种意义上说,它不像PCA,你可能只选择保留10个主要组件中的2个。

当你进行上面所做的那种修剪时,你真的只是去掉了一些"噪音"你的数据。数据仍然是相同的维度。