1

我正在关注一个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仍然具有相同的维度。我需要将其用于语义分析。

4

1 回答 1

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.
于 2015-07-12T18:45:15.047 回答