2015-07-12 35 views
1

我下面SVD的例子,但我仍然不知道如何降低最终的矩阵尺寸:R-降维LSA

a <- round(runif(10)*100) 
dat <- as.matrix(iris[a,-5]) 
rownames(dat) <- c(1:10) 

s <- svd(dat) 

pc.use <- 1 
recon <- s$u[,pc.use] %*% diag(s$d[pc.use], length(pc.use), length(pc.use)) %*% t(s$v[,pc.use]) 

recon仍然有相同的尺寸。我需要将其用于语义分析。

回答

1

您提供的代码不会降低维度。相反,它需要从您的数据中获取第一个主成分,删除剩余的主成分,然后只用一台PC重建数据。

您可以检查,这种情况是通过检查最终矩阵的秩:

library(Matrix) 
rankMatrix(dat) 
as.numeric(rankMatrix(dat)) 
[1] 4 
as.numeric(rankMatrix(recon)) 
[1] 1 

如果你想减少维(行数) - 您可以选择一些主要的主要成分,并计算分数您的数据在这些组件上。但是首先让我们清楚一些关于您的数据的事情 - 看起来您有10个具有4个特征(列)的样本(行)。降维将使4个特征减少到一组较小的特征。

所以,你可以通过转的矩阵svd()开始:

dat <- t(dat) 
dat 
       1 2 3 4 5 6 7 8 9 10 
Sepal.Length 6.7 6.1 5.8 5.1 6.1 5.1 4.8 5.2 6.1 5.7 
Sepal.Width 3.1 2.8 4.0 3.8 3.0 3.7 3.0 4.1 2.8 3.8 
Petal.Length 4.4 4.0 1.2 1.5 4.6 1.5 1.4 1.5 4.7 1.7 
Petal.Width 1.4 1.3 0.2 0.3 1.4 0.4 0.1 0.1 1.2 0.3 

现在你可以重复SVD。建议在此过程之前将数据居中:

s <- svd(dat - rowMeans(dat)) 

主要组件可以通过将数据投影到PC上获得。

PCs <- t(s$u) %*% dat 

现在如果你想通过消除与低方差电脑,以减少维度你可以这样做是这样的:

dat2 <- PCs[1:2,] # would select first two PCs. 
+0

但关于原班呢?我需要保留一个包含原始类的矩阵,以使用例如knn对数据集进行分类。 – GabyLP

+0

所以我只是粘贴相同的类? – GabyLP

+1

嗯什么类?我在发布的代码中没有看到任何类标签。但是让我们继续 - 在数据中有10个样本和4个特征。 PCA和选择前2台PC后,您将拥有2个功能和10个相同的样本。所以所有的样品都是一样的,他们的顺序是一样的。如果你有他们,你可以使用相同的类标签。请注意,在我的代码中,样本位于行中的列和功能中。 –