在R中使用PCA - 更改轴以删除列

时间:2016-03-01 20:26:52

标签: r pca

我在R中有以下代码。简单地说,我从https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data的虹膜数据开始。 然后,我想对此数据集执行主成分分析,最终得到一个二维数据集,最后我可以制作最终数据的散点图。我使用prcomp函数来获取主成分,并从中获取旋转。

irisdat <- read.csv('iris.data', header=FALSE)
library(lattice)
library(stats)
numiris=irisdat[,c(1,2,3,4)]
pr=prcomp(numiris, center=TRUE, scale=TRUE)
newdata = as.matrix(numiris) %*% pr$rotation
pr2=prcomp(newdata, center=TRUE, scale=TRUE)
newdata2 = as.matrix(newdata) %*% pr2$rotation

现在我遇到的问题是,我最终得到一个仍然有四个维度的矩阵,当我想在结束时将其降为两个但是我不确定如何删除列,或者什么在进行主成分分析投影后删除。

另外,我遇​​到的问题是我的结果与原始数据相反,因此如果我打印出带有splom的散点图矩阵,则散点图会反转。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我有点不清楚你在问什么...但我会试一试。

PCA本身不会删除列;在大多数情况下,您最终会得到与功能相同数量的组件。不同之处在于,每个主要分量是输入特征的线性组合,并且与每个其他分量正交(因而不相关)。通过解释的可变性来降低组件的排列。人们通常保留前N个成分,这些成分累积地解释了约70%的变异性。你可以得到 解释方差的百分比如下:

numiris = iris[,1:4] ## iris is built-in
pr = prcomp(numiris, center=TRUE, scale=TRUE)
> cumsum(pr$sdev^2 / sum(pr$sdev^2))
[1] 0.7296245 0.9581321 0.9948213 1.0000000

因此,您将保留案例中的第一个组件:

reduced = as.matrix(pr$rotation[,1])

但是,如果您完全坚持保留两个:

reduced = as.matrix(pr$rotation[,1:2])

此外,您可以使用prcomp绘制screeplot对象。

答案 1 :(得分:-1)

某些方法(例如irlba)允许您指定多个返回的向量。否则,您可以利用返回列从左到右的重要性递减的事实。尝试使用newdata[,1:2]。 MrFlick是对的,iris数据集内置于R。