我正在效仿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仍然具有相同的维度。我需要用这个来进行语义分析。
发布于 2015-07-12 18:45:15
您提供的代码不会降低维度。相反,它从您的数据中获取第一个主组件,删除其余的主组件,然后只使用一台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.https://stackoverflow.com/questions/31369690
复制相似问题