我正在使用带有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)
我得到具有相同尺寸(4x4)的A',仅用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]
最终目标是减少列的数量,以加快大型数据集上的聚类算法。
如果有人能指导我,提前谢谢你:)
我会看看这一章关于降维或这个交叉验证的问题。其思想是整个数据集可以用更少的信息重建。它不像PCA,你可能只选择保留10个主成分中的2个。
当你做上面所做的那种修剪时,你实际上只是去掉了数据中的一些"噪音"。