【问题标题】:Calculate the transformation of a PCA in R?计算 R 中 PCA 的转换?
【发布时间】:2016-07-19 19:20:32
【问题描述】:

我正在寻找代表从数据集到其 PC 的映射的权重。目的是建立一个“校准”的固定空间,例如三种葡萄酒以及新的观察结果,例如引入了一种新的葡萄酒,它可以在先前校准的空间内进行分配,而无需更改固定的 PC 值。因此,可以通过执行应用于前三种类型的转换来适当地分配新的观察结果。

 library(ggbiplot)
 data(wine)
 wine.pca <- prcomp(wine, center = TRUE, scale. = TRUE)
 print(ggbiplot(wine.pca, obs.scale = 1, var.scale = 1, groups =   wine.class, ellipse = TRUE, circle = TRUE))

编辑: wine 数据集被分成训练数据,以获得我所说的校准空间。

samp <- sample(nrow(wine), nrow(wine)*0.75)
wine.train <- wine[samp,]

然后使用训练数据对要验证的数据集进行子集化,例如

wine.valid <- wine[-samp,]

#PCA on training data
wine.train.pca <- prcomp(wine.train, center = TRUE, scale. = TRUE)
#use the transformation matrix from the training data to predict the validation data
pred <- predict(wine.train.pca, newdata = wine.valid)

随后,此thread 解决了如何表示由训练和转换的验证/测试数据产生的校准空间。

【问题讨论】:

  • 您无法将 wine.pca 中的 PC 坐标与 pred 进行比较,因为它们的样本数量不同。另外,它没有意义,因为 wine.pca 已经包含 pred 中的坐标。您现在已经澄清您实际上想要预测葡萄酒类别,所以我认为我对 randomForest 的后续建议是一个不错的选择。
  • 抱歉一直是 afc - 感谢@Marcinthebox 再次回复和解释!我在上面的示例中有一个错字,因为它是 ncol(wine) 而不是 nrow(wine)。此外,预测数据中应该没有给出类,所以我将它们更改为“未知”。
  • 刚刚遇到了这个不错的答案,又是@Marcinthebox,澄清了一个类似的问题,可以在这里找到:stats.stackexchange.com/questions/72839/…
  • This 为在 ggbiplot 中绘制训练和验证数据集提供了后续答案。

标签: r classification random-forest pca


【解决方案1】:

使用prcomppredict 函数很容易做到这一点。下面我通过将您的葡萄酒数据分成两部分来展示性能;训练和验证数据集。然后将使用训练集上的 prcomp-fitted PCA 对验证 PCA 坐标的预测与从完整数据集导出的相同坐标进行比较:

library(ggbiplot)
data(wine)

# pca on whole dataset
wine.pca <- prcomp(wine, center = TRUE, scale. = TRUE)

# pca on training part of dataset, then project new data onto pca coordinates 
set.seed(1)
samp <- sample(nrow(wine), nrow(wine)*0.75)
wine.train <- wine[samp,]
wine.valid <- wine[-samp,]
wine.train.pca <- prcomp(wine.train, center = TRUE, scale. = TRUE)
pred <- predict(wine.train.pca, newdata = wine.valid)

# plot original vs predicted pca coordinates
matplot(wine.pca$x[-samp,,1:4], pred[,1:4])

您还可以查看预测坐标和原始坐标之间的相关性,发现它们对于领先的 PC 来说非常高:

# correlation of predicted coordinates
abs(diag(cor(wine.pca$x[-samp,], pred[,])))
#       PC1       PC2       PC3       PC4       PC5       PC6       PC7       PC8       PC9      PC10 
# 0.9991291 0.9955028 0.9882540 0.9418268 0.9681989 0.9770390 0.9603593 0.8991734 0.8090762 0.9326917 
#      PC11      PC12      PC13 
# 0.9270951 0.9596963 0.9397388 

编辑:

这里是一个使用randomForest进行分类的例子:

library(ggbiplot)
data(wine)
wine$class <- wine.class

# install.packages("randomForest")
library(randomForest)

set.seed(1)
train <- sample(nrow(wine), nrow(wine)*0.5)
valid <- seq(nrow(wine))[-train]
winetrain <- wine[train,]
winevalid <- wine[valid,]

modfit <- randomForest(class~., data=winetrain, nTree=500)
pred <- predict(modfit, newdata=winevalid, type='class')

每个变量的重要性可以通过以下方式返回:

importance(modfit) # importance of variables in predition
#                MeanDecreaseGini
# Alcohol               8.5032770
# MalicAcid             1.3122286
# Ash                   0.6827924
# AlcAsh                1.9517369
# Mg                    1.3632713
# Phenols               2.7943536
# Flav                  6.5798205
# NonFlavPhenols        1.1712744
# Proa                  1.2412928
# Color                 8.7097870
# Hue                   5.2674082
# OD                    6.6101764
# Proline              10.7032775

并且,预测准确率返回如下:

TAB <- table(pred, winevalid$class) # table of preditions vs. original classifications
TAB
# pred         barolo grignolino barbera
#   barolo         29          1       0
#   grignolino      1         30       0
#   barbera         0          1      27

sum(diag(TAB)) / sum(TAB) # overall accuracy
# [1] 0.9662921

【讨论】:

  • 感谢您的回答!据我了解(我的 R 耳朵后面仍然有点湿)它指向正确的方向,但我的目标略有不同 - 我将在上面重新表述以进行澄清。
  • 我认为你会受益于分类模型(例如随机森林)。我添加了一个示例 shown here,用于预测 iris 数据集中的物种。
  • 我认为您的第一个解释已经完成了任务。刚刚有一个朋友向我详细解释了它,我终于明白了。我将再次编辑问题的介绍以使其清楚。后续问题是如何很好地绘制预测数据和训练数据,例如使用 ggbiplot,但可能是另一个主题。
  • 很高兴现在可以理解了。绘图问题可能应该转到一个新问题 - 尽管我想您可以在网站上找到相关问题。
  • 还有一些晦涩难懂的地方,为什么 wine.pca 可以和 pred:matplot(wine.pca$x[-samp,1:4], pred[,1:4]) 和 wine.train 不可以比:matplot(wine.train.pca$x[,1:4], pred[,1:4]) Error in ... 'x' and 'y' must有相同的行数。 不过,这三个都有不同的行数:str(wine.pca$x) ... num [1:178, 1:13] ...str(wine.train.pca$x) ... num [1:133, 1:13]...str(pred) ... num [1:45, 1:13] ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2012-05-12
相关资源
最近更新 更多