前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

PCA主成分分析 (R语言)(pca主成分分析软件)

qiguaw 2024-09-18 23:22:17 资源文章 16 ℃ 0 评论

前天介绍了PCA主成分分析,使用的是Python进行案例的演示,今天继续使用R语言再来一遍,以便不同的人可以有不同的选择。为了不来回跳动,今天还是大概写一下完整的流程。

【什么是PCA】

PCA(Principal Component Analysis,主成分分析)是一种统计技术,用于将高维数据投影到低维空间,同时保留尽可能多的信息。PCA通过寻找数据中方差最大的方向(即主成分),帮助我们理解和简化数据结构。

【为什么需要PCA】

主要有以下四点:

  1. 降维:在处理高维数据时,PCA可以减少特征数量,降低计算复杂度;
  2. 数据压缩:通过减少特征数量,降低数据存储需求;
  3. 去除噪声:通过保留主要成分,去除对结果影响较小的噪声;
  4. 数据可视化:将高维数据转换为2D或3D,便于可视化和理解数据。

【数据预处理】

因为PCA对数据的尺度敏感,如果特征在不同的尺度上,方差较大的特征会主导主成分。所以最好是先进行标准化处理,这里就使用R语言里面大家最熟悉的iris数据集演示↓

data(iris)
# 移除分类标签,只保留数值特征
iris_data <- iris[, -5]
# 进行标准化
iris_scaled <- scale(iris_data)
# 查看标准化后的数据
head(iris_scaled)

可以看到数据前后,已经被标准化了,标准化后的数据每个特征的均值为0,标准差为1,可以通过以下代码验证↓

mean(iris_scaled[,1]) # 应该接近0
sd(iris_scaled[,1])   # 应该接近1
> mean(iris_scaled[,1])
[1] -4.484318e-16
> sd(iris_scaled[,1])
[1] 1


【协方差矩阵】

协方差矩阵显示了每对特征之间的协方差,值越大表示特征间的线性关系越强,下面计算一下协方差矩阵值↓

# 计算协方差矩阵
cov_matrix <- cov(iris_scaled)
# 查看协方差矩阵
print(cov_matrix)
> print(cov_matrix)
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000

从结果可以看到,还是有几组协方差值非常大的,说明有部分特征之间还是有很强的线性关系。

【特征值和特征向量】

特征值和特征向量是描述协方差矩阵的关键,它们决定了主成分的方向和重要性。

特征值(Eigenvalues):特征值是一个标量,表示一个线性变换在特征向量方向上的伸缩因子。在PCA中,特征值表示主成分的方差大小,即该主成分对数据变化的贡献度。特征值越大,表示对应的主成分解释的数据方差越多。因此,可以通过比较特征值的大小,选择保留的主成分数量。

特征向量(Eigenvectors):特征向量是一个向量,表示数据在特征空间的方向。在PCA中,特征向量定义了新的坐标轴(主成分)的方向。

# 计算特征值和特征向量
eig <- eigen(cov_matrix)
eig_values <- eig$values
eig_vectors <- eig$vectors
# 查看特征值和特征向量
print(eig_values)
print(eig_vectors)
> print(eig_values)
[1] 2.91849782 0.91403047 0.14675688 0.02071484
> print(eig_vectors)
           [,1]        [,2]       [,3]       [,4]
[1,]  0.5210659 -0.37741762  0.7195664  0.2612863
[2,] -0.2693474 -0.92329566 -0.2443818 -0.1235096
[3,]  0.5804131 -0.02449161 -0.1421264 -0.8014492
[4,]  0.5648565 -0.06694199 -0.6342727  0.5235971

第一个特征值:2.918,解释了最多的方差。第二个特征值:0.914,解释了次多的方差。第三个特征值:0.147,解释了较少的方差。第四个特征值:0.021,解释了最少的方差。

第一个主成分(对应第一个特征值):[0.521, -0.269, 0.58, 0.564]

该向量的各个分量表示原始特征在第一个主成分方向上的权重。

第二个主成分(对应第二个特征值):[-0.377, -0.923, -0.024, -0.066]

该向量的各个分量表示原始特征在第二个主成分方向上的权重。后面以此类推。

【主成分选择】

通过累计方差解释率,选择累计方差解释率达到一个阈值的主成分数。然后还可以通过碎石图直观判断,碎石图显示了每个主成分的累积方差,选择拐点前的主成分数↓

explained_variance <- eig_values / sum(eig_values)
cumulative_variance <- cumsum(explained_variance)
# 绘制碎石图
plot(cumulative_variance, type='b', xlab='数量', ylab='累积解释方差', main='碎石图')
> cumulative_variance
[1] 0.7296245 0.9581321 0.9948213 1.0000000

前面两个维度就已经解释了95.8的信息了,所有这里选择两个主成分就行了。

【主成分二维可视化】

使用R语言进行PCA的编程实现,展示如何使用常用的R包prcomp和ggplot2进行PCA分析和可视化↓

pca_result <- prcomp(iris_data, center=TRUE, scale.=TRUE)
# 查看PCA结果
summary(pca_result)
# 提取主成分得分
pca_scores <- pca_result$x
# 将PCA结果与原始标签结合
pca_data <- data.frame(pca_scores, Species=iris$Species)
# 使用ggplot2进行可视化
library(ggplot2)
ggplot(pca_data, aes(x=PC1, y=PC2, color=Species)) +
  geom_point(size=3) +
  labs(title="PCA主成分分析二维图", x="主成分1", y="主成分2")

通过降维,我们就从思维的数据降到了二维,并可以直观的在二维平面上可视化展示了。

最后还要说明一下PCA的局限性。一是线性假设,PCA假设特征之间的关系是线性的,无法捕捉非线性关系。二是噪声敏感:PCA对异常值和噪声较为敏感,可能影响结果。使用的数据需要先进行数据的检验。

链接是我使用PowerBI整合的历史文章,按类型分类,可以根据需求查询:Microsoft Power BI↓

https://app.powerbi.com/view?r=eyJrIjoiNjI2NWQ3NjktYjU0ZC00ZWZhLTgzMDgtMGI4ZTk1ZDlkODM3IiwidCI6IjI3NDQ3MWQ0LTM4ZDQtNDVlZS1hMmJkLWU1NTVhOTBkYzM4NiJ9

End

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表