我正在关注一个svd的例子,但我仍然不知道如何减少最终矩阵的维度:
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
仍具有相同的维度。我需要将它用于语义分析。
答案 0 :(得分: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
现在,如果您希望通过消除方差较小的PC来降低维度,可以这样做:
dat2 <- PCs[1:2,] # would select first two PCs.