R-降维LSA

R- reduce dimensionality LSA

我正在学习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仍然具有相同的维度。我需要用它来进行语义分析。

您提供的代码没有降维。相反,它从您的数据中获取第一个主成分,删除其余的主成分,然后仅用一台 PC 重建数据。

您可以通过检查最终矩阵的秩来检查是否发生了这种情况:

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

如果您想减少维度(行数)- 您可以 select 一些主要的主成分,然后计算这些成分的数据分数。

但首先让我们弄清楚您的数据 - 看起来您有 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.