首页
学习
活动
专区
圈层
工具
发布

R-降维
EN

Stack Overflow用户
提问于 2015-07-12 15:54:45
回答 1查看 470关注 0票数 1

我正在效仿svd,但我仍然不知道如何减少最终矩阵的维数:

代码语言:javascript
复制
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仍然具有相同的维度。我需要用这个来进行语义分析。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-12 18:45:15

您提供的代码不会降低维度。相反,它从您的数据中获取第一个主组件,删除其余的主组件,然后只使用一台PC重新构造数据。

您可以通过检查最终矩阵的级别来检查是否正在发生这种情况:

代码语言:javascript
复制
library(Matrix)
rankMatrix(dat)
as.numeric(rankMatrix(dat))
[1] 4
as.numeric(rankMatrix(recon))
[1] 1

如果你想减少维数(行数),你可以选择一些主成分,然后计算你的数据在这些成分上的分数。

但是首先,让我们澄清一些关于您的数据的事情--似乎您有10个示例(行)和4个特性(列)。降维将使这4个特征减少到一个较小的特征集。

因此,您可以从转移svd()的矩阵开始

代码语言:javascript
复制
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了。在本程序之前以数据为中心是可取的:

代码语言:javascript
复制
s <- svd(dat - rowMeans(dat))

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

代码语言:javascript
复制
PCs <- t(s$u) %*% dat

现在,如果您想通过消除低方差的PC来降低维度,您可以这样做:

代码语言:javascript
复制
dat2 <- PCs[1:2,] # would select first two PCs.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31369690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档