您的位置:

R语言主成分分析

一、主成分分析概述

主成分分析(Principal Component Analysis, PCA)是一种常见的线性降维技术,用于发现数据中的主要关系。主成分分析可以将高维数据降维到较低维度,同时保留数据的主要特征。

主成分分析的主要目的是通过对多维数据集进行旋转和变换,找到解释数据变异性的最大方向。这些方向被称为主成分,其对应的特征向量及其所占的方差比例越大,说明这个主成分所解释的数据变异越多。主成分的个数等于数据维度的数量或小于这个值。主成分分析后,可以基于主成分展开对原始数据的重新建模,以达到数据降维、可视化或初步探索结构的目的。

下面提供一个主成分分析的简单例子,了解如何用R语言进行主成分分析。我们使用自带的iris数据集,它描述了鸢尾花的不同属性,分为三个品种。数据集中包含了150行和5列。


#导入iris数据集
data(iris)
dim(iris) #查看数据集的维度,150行5列
head(iris) #查看前六行数据
#选取鸢尾花的四个属性作为主成分,这四个属性是数值型的
iris_pca<-prcomp(iris[,1:4],scale = TRUE) #输入剪枝过的数据集
summary(iris_pca) #查看主成分分析结果

二、主成分分析的应用

主成分分析可以优化模型和降低数据的大小。接下来,我们将介绍PCA在数据可视化、聚类分析和异常检测方面的应用。

1. 数据可视化

主成分分析的一个最重要的应用就是数据的可视化。PCA是从原始数据中提取主要信息的一种方法,因此,对于高维数据,它可以将其转化为二维或三维空间,从而显著提高数据的可视化性。下面是一个二维PCA可视化的代码示例。


library(ggbiplot) #导入ggplot2和ggbiplot包

#加载数据集
data(iris) 
#执行PCA并将结果绘制在2D图形中
iris.pca <- prcomp(iris[,1:4], center = TRUE, scale. = TRUE)
ggbiplot(iris.pca, obs.scale = 1, var.scale = 1, alpha = 0.5, groups = iris$Species, var.axes = TRUE) + scale_color_discrete(name = '')

2. 聚类分析

PCA被广泛用于聚类分析,可以通过PCA降维来减少特征向量数量,从而使数据更易于处理。一旦执行PCA并找到数据的主要变化方向,就可以将它们投影到新的低维空间中进行聚类分析。

下面是一个PCA和聚类分析的代码示例:


#加载数据集
data(iris) 
#执行PCA并将数据映射到二维平面
pca_result <- prcomp(iris[,1:4], center = TRUE, scale. = TRUE)
irispca <- data.frame(pca_result$x[,1:2], Species = iris$Species)

#kmeans算法的聚类分析
km <- kmeans(pca_result$x[,1:2], 3, nstart = 20)
cl <- km$cluster
plot(irispca[,1:2], col = cl, pch = 20, 
     main = "PCA and K-means clustering of Iris data",
     xlab = "PC1", ylab = "PC2")

3. 异常检测

主成分分析也可以用来识别异常值或异常簇。异常值是与一般数据点显着不同的数据点,而异常簇则是与其他簇明显不同的数据簇。PCA可以将数据投影到新的轴上,这些轴捕捉数据的主要变化方向。异常数据点或簇通常在主成分分析过程中由于保留的方差较小而被排除。

下面是一个用于识别异常值的PCA例子:


#加载数据集
data(mtcars)
X <- as.matrix(mtcars)
#执行PCA
pc <- prcomp(X, scale = TRUE)
#计算每个观测值的模型适应度
outlierscores <- apply(pc$x, 1, function(x) sum(x^2))
#按照得分排序
outlierscores <- sort(outlierscores, decreasing = TRUE)

#标出最大值和最小值
par(mar=c(6,6,1,1))
plot(outlierscores, pch = 20, cex = 1.5, xlab = "Observations", ylab = "Outlier Scores", main = "Outlier Detection via PCA") 
text(x = 1:length(outlierscores), y = outlierscores, labels = ifelse(outlierscores == max(outlierscores), round(outlierscores, 2), ""), pos = 1, col = "red")
text(x = 1:length(outlierscores), y = outlierscores, labels = ifelse(outlierscores == min(outlierscores), round(outlierscores, 2), ""), pos = 3, col = "blue")

三、主成分分析的参数和限制

主成分分析具有两个重要的参数。第一个参数是要保留的主成分的数量,第二个参数是要使用的旋转类型。为了保留大部分数据的变化,我们可以选择保留前k个主成分,其中k小于或等于原始数据的维度。另一个参数是变量旋转,它包括方差旋转和直角旋转。方差旋转消除了特征之间的相关性,使每个主成分的方差最大化。直角旋转被认为是最优选择,在很大程度上降低了数据的维度,同时仍然保留了各个主成分的可解释性。

虽然主成分分析是一种强大的工具,但也存在一些限制。首先,在数据维度较高时,计算成本会变得非常昂贵。次要问题是数据稀疏性和解释性。当数据集具有许多缺失值或不相关的特征时,主成分分析可能无法提供良好的解释或可视化。

四、结语

本文介绍了R语言主成分分析的相关知识。主成分分析可以用于数据可视化、聚类分析和异常检测。然而,主成分分析有一些限制,当计算成本很高或数据无法解释时,它的效果可能会受到影响。本文提供了用于执行主成分分析的基本代码示例。随着更多的研究人员和开发人员在各自的领域中使用主成分分析,这种技术的应用也会变得越来越广泛。