本文转自原文翻译:
Extract and Visualize the Results of Multivariate Data Analysesrpkgs.datanovia.com引言
当变量多于三个时,将其关系可视化就更加困难。幸运的是,在具有许多变量的数据集中,一些变量通常是相关的。这可以通过以下事实来解释:一个以上的变量可能正在测量控制系统行为的相同驱动原理。相关性表明数据中存在冗余。发生这种情况时,可以通过用一个新变量替换一组相关变量来简化问题。主成分分析是用于实现此简化的严格统计方法。该方法创建一组新的变量,称为主成分。每个主成分是原始变量的线性组合。所有主成分彼此正交,因此没有冗余信息。
PCA 是许多人觉得有点难以掌握的概念之一。我也有同样的问题,但现在我想出一个办法来解释它简单和明确的术语。但是,我们实际上需要从维数缩减的概念开始。
![dd5cff9a2664be5dadb49791821f5bba.png](https://i-blog.csdnimg.cn/blog_migrate/16b4a20dd4f69d7c29e4deadd2640efb.png)
本教程假定您对主要组件分析没有任何了解。但预计您具有一些矩阵操作的基本知识
我们将涵盖以下领域
一、PCA与降维简介
1. 降维简介
维度是指与每个数据测量关联的要素数。它对应于表格数据中的列。
当数据集超过 2D 或 3D 时,很难可视化。但是,大多数用于分析的数据集都具有非常大的维度,例如数十个甚至数百个。因此,我们如何管理此方案。这就是维数缩减概念发挥作用的地方。
统计和机器学习的尺寸减小是通过获取一组几个主要变量来减少所考虑的随机变量数的过程。
2. 高维数据问题
现在,让我们概述高维数据的四个问题,使维数降低非常重要
a) 时间和空间复杂性:使用非常高维数据的模型训练会产生高空间和时间复杂性。这仅仅意味着需要更多的内存空间,也需要更多的处理时间
b) 过度拟合问题:高维数据还可能导致过度拟合问题,因为创建的模型无法捕获全新的数据点
c) 冗余功能:并非所有数据功能都相关
d) 噪声:较低尺寸的数据通常具有较低的噪声(或不必要的数据)
3. 降维的类型
您必须知道,有两种类型的维数降低,即:
功能提取:这是从高维数据转换为低维空间后,必须查找数据中新要素的技术。
功能选择: 是查找给定数据最相关功能的技术。它通过获取原始数据集中变量的关键要素子集完成。
区别在于,虽然要素提取有意查找新变量,但要素选择侧重于从现有数据中选择最相关的要素。
4. 降维方法
虽然我们将讨论主要组件分析在这个博客,我也想让你知道各种其他算法存在为维数降低。我们只会强调四种方法
a) 主要组件分析(PCA):该方法应用线性近似法找出对数据集中方差贡献最大的分量。
b) 多维缩放(MDS):这是一种维数缩减技术,通过创建数据点在数据点的相对位置的地图来工作。
c) 因子分析(FA):这是一种统计方法,用于描述观测变量和相关变量中存在的变异,这些变量的数量较少。
d) 独立成分分析(ICA):这是从因子分析和搜索导致独立组件的数据旋转开始的技术。
现在让我们关注主要组件分析 (PCA)
5. 什么是主要成分分析(PCA)
有许多方法可以定义PCA。但是现在,让我们使用一个简单的定义。PCA 是一种方差最大化技术,可将现有数据投影到最大化方差的方向上。PCA 对原始数据进行线性映射到低维子空间,从而最大化低维数据的变化度。我们只是说,这是一分钟。
PCA 是一种不受监督的学习方法,因为它只使用一组功能 X1Ⅹ2, . . . XP没有任何类或标签。PCA 是计算主要组件并使用它来解释数据的过程。
6. 什么是真正的主要成分。
让我们从 p 非常大的 n 个观测值和 p 要素的数据集开始。概念是,每个 n 个观测值都位于 p 维空间中。因此,对于每个观测,并非所有维度都非常有用。我们感兴趣的是找出每个观测值的量,每个维度各不相同。
PCA 发现的每个维度都称为 p 要素的线性组合。现在,我们将讨论在 PCA 教程 2 中查找主要组件的详细信息。
二、如何执行主成分-----PCA(理论)
作为简要介绍,请记住,主要组件是通过矩阵乘法获得的。确切地说,我们必须将原始数据矩阵 X 乘以加载矩阵 Ω。这将给我们的分数。所以,你可以跳转到关于分数和加载,然后回来继续。
1. The Second Principal Component (Z2)
我们有数据 X, 这是 n x p 数据集。这意味着 n 个观测值(记录或行)和 p 要素(或变量)。这表示,如 X 矩阵所示。
![79296562fc56068061ce0918941d0ddf.png](https://i-blog.csdnimg.cn/blog_migrate/42e0c138eb71727f30db4c3a0e38d6d6.png)
我们定义了一组功能 X 的第一个主要组件1Ⅹ2. . . . . XP作为原始数据中要素/变量的规范化线性组合:
Z1= Φ11Ⅹ1+ Φ21Ⅹ2+ . . . + Φp1ⅩP——- (PC1)
方差最高。
元素 = 称为第一个主组件的加载,它们使 μs 的平方和等于 1;
![4295942f9c6056c3df5e5a11492fdc56.png](https://i-blog.csdnimg.cn/blog_migrate/eee5f8398531029606188a051a0dae65.png)
加载的组合构成加载矢量的主要组件 (+11Ф21. . .Фp1)T加载向量的组合是载荷矩阵。
Ⅹ1Ⅹ2. . . . . XP特征变量的归一化线性组合,这意味着它们具有等于零的均值和等于 1 的标准差。
2. 第二个主要组成部分 (Z2)
第二个主要组件 Z2 也是预测变量(要素)的线性组合,这些变量的方差仅次于 Z1。还应注意 Z2 与 Z1 不相关,这意味着 Z1 和 Z2 的方向是正交的,如图 1.0 所示。
Z2= Φ12Ⅹ1+ Φ22Ⅹ2+ . . . + Φp2ⅩP——- (PC1)
可以以类似方式计算其他组件。
计算完成后,主要组件说(Z1 和 Z2),然后我们可以在平面上绘制它们,在 2d 绘图上将它们对另一个。输出类似于图 1.0
![140551b36be3a6a2de222671c77f6dd6.png](https://i-blog.csdnimg.cn/blog_migrate/f890b7779cbd460ba9f1fdbd0a5ae5d7.png)
3. 关于分数和加载
在PCA中,我们分解原始数据矩阵 X 并分解为项:
- 一组特征值
- 特征向量集
这两个一起组合了特征对。现在,让我们想象一下特征向量集会是什么样子。这显示在下面的矩阵中,这称为加载矩阵。
![4b4dcb6a9fc954627befccc08f41f3cd.png](https://i-blog.csdnimg.cn/blog_migrate/226904f45b3b6ebed4a6783d52098043.png)
请注意以下有关加载矩阵
- 此矩阵是一个方形矩阵(具有相同的行和列)
- 此矩阵的尺寸 (p x p) 来自原始矩阵 X 的要素数
加载矩阵的每一列对应于一个主组件。
对于第一列,我们有以下元素 (×11Ф21. . .Фp1).这是第一个主组件的加载
对于第二列,我们有以下元素 (×12Ф22. . .Фp2).这是第二个主要组件的加载
对于第三列,我们有以下元素 (×13Ф23. . .Фp3).这是第三个主要组件的加载
对于pth 列,我们有以下元素 (×1 便士Ф2 便士. . .ФPp)..这是pth 主组件的加载
现在,让我们尝试将矩阵 X和 2相乘以,让我们看看我们将获得什么。让我们调用此矩阵X#。此操作为我们提供了一组称为分数的数字(只是一组一维值)
![f9d763153d3558b4a1e379e8bddc9129.png](https://i-blog.csdnimg.cn/blog_migrate/d8951f2506d5e6bcfe3bc37fbea257f9.png)
X是 n
x p 矩阵2 是p x p 矩阵
因此,将X乘以Φ将只提供一维数据。如果您不确定这一点,您可以浏览一下针对本教程的矩阵操作的简要回顾。
这两个矩阵的组成将给我们以下元素:
以第一行 X 和第一列的 Φ,我们将有:
Ⅹ11Ф11 x12[21]. . . = x1 便士Фp1(这是第一个主要组件 (PC1)
以 X 的第二行和 2 列的 2, 我们将有:
Ⅹ21Ф12 x22Ф22[. . . = x2 便士Фp2(这是第二个主要组件 (PC2)
等等
4. 解释主要组成部分
当我们在 n x p 数据集上执行 PCA 时,我们获得一个加载矩阵 = 这也是一个 n x p 矩阵。然后,我们可以仅使用此矩阵的左几列(如 2 列)作为我们的主要组件,并沿这些方向投射数据。
当我们执行 PCA 时,我们将从 p 维空间的数据投影到二维空间中
这一切意味着什么?让我们使用特定的数据集进行说明。这将有助于我们了解在对数据执行 PCA 后数据集的影响。
现在您已经了解如何执行主要组件分析了,现在让我们移动一个类似的主题,即单数值分解。
三、执行步骤
(一)R语言的一些基本操作
1.如何从CRAN安装软件包?
install.packages("FactoMineR")
install.packages("factoextra")
2.如何从GitHub安装软件包?如果您的计算机上尚未安装devtools,则应先安装它:
网站为:https://github.com/kassambara/facoextra
install.packages("devtools")
devtools::install_github("kassambara/factoextra")
请注意,GitHub包含R包的最新开发版本。
3.安装后,必须先加载软件包才能使用软件包中的功能。函数library()用于此次操作。
library("FactoMineR")
library("factoextra")
现在,我们可以使用R函数,例如PCA()[在FactoMineR程序包中]进行主成分分析。
4. 获得有关R中功能的帮助
如果要了解有关给定功能的更多信息,例如PCA(),请在R控制台中键入以下内容:
?PCA
5.将数据导入R
#txt文件:读取制表符分隔的值
my_data <- read.delim(file.choose(), row.names = 1)
#csv文件:读取逗号(“,”)分隔的值
my_data <- read.csv(file.choose(), row.names = 1)
#csv文件:读取分号(“;”)分隔的值
my_data <- read.csv2(file.choose(), row.names = 1)
以上导入的数据将属于data.frame数据框类(R术语)。数据导入R的更多信息可以查看: http://www.sthda.com/english/wiki/importing-data-into-r 。
(二) FactoMineR的主要功能
1. 用于计算主成分方法和聚类的函数:
![6ef29632a36c404c5b443aa9a05ef185.png](https://i-blog.csdnimg.cn/blog_migrate/e4c66abab7ef48b105bae794944d4d7f.png)
2.factoextra的主要功能
下表列出了本书涵盖的事实功能。有关完整列表,请参见在线文档:(http://www.sthda.com/english/rpkgs/factoextra)
可视化主成分方法输出:
![90990396188135c439bbf527713eb234.png](https://i-blog.csdnimg.cn/blog_migrate/afe8465d70c11133ed601fe19904425f.png)
从主成分方法输出中提取数据。
![884e30aed0199eca0b88366de567a536.png](https://i-blog.csdnimg.cn/blog_migrate/78c2d5879a713b8467081a0718ac5754.png)
3.聚类分析和可视化
![642a276ee527842a450836df9efca8db.png](https://i-blog.csdnimg.cn/blog_migrate/f65afb5f6f102cee9677a22a144b090c.png)
(三)案例分析
1.加载数据
library(factoextra)
library(FactoMineR)
library(ggplot2)
data("decathlon2")
df <- decathlon2[1:23, 1:10]
![29fac42d90429d7b32c979f1b370dddb.png](https://i-blog.csdnimg.cn/blog_migrate/f0aac6d18baa6619116392a8569ba541.jpeg)
2.主成分分析
res.pca <- PCA(df, graph = FALSE);res.pac
![b76b42f1c6d86241866f2ed0c6ccfd56.png](https://i-blog.csdnimg.cn/blog_migrate/13314449d8d9e5dae59b337c7c6e8b2d.jpeg)
3.特征值方差的提取
get_eig(res.pca)
#eigenvalue=特征值方差
#variance.percent=方差百分比
#cumulative.variance.percent=累积方差百分比
![3b4fa7f37525e20af6e7fdc6a89bddde.png](https://i-blog.csdnimg.cn/blog_migrate/42ee0c768fddca31db8faf7899cc81dd.jpeg)
4.可视化特征值/方差
# 可视化特征值/方差
fviz_screeplot(res.pca, addlabels = TRUE, ylim = c(0, 50))
![859d4d75c27d4e1b71de2a54e7319ed5.png](https://i-blog.csdnimg.cn/blog_migrate/5f4c8e471fe1afe12e4592dc4e736e6a.png)
#提取变量的结果
var <- get_pca_var(res.pca);var
head(var$coord)
head(var$contrib)
head(var$cos2)
head(var$cor)
![33c7c73b3b89752b092107692adfc046.png](https://i-blog.csdnimg.cn/blog_migrate/de49d228673e8444dc8dbcc9306c69cb.jpeg)
![89eb987b7e774957692e239c48e64959.png](https://i-blog.csdnimg.cn/blog_migrate/769c1f423c4f1971f86bc08596f0839e.jpeg)
#可视化第一维度,第二维度
fviz_pca_var(res.pca, col.var = "black")
![a6c627a7d1e1da72cfb50dd23cbea7dc.png](https://i-blog.csdnimg.cn/blog_migrate/4a9d32a90dc2e553634132b879702609.png)
#使用变量的颜色来控制contrib变量的可视化颜色
fviz_pca_var(res.pca, col.var="contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # 避免文字重叠
)
![be115ff292df2943a5de9b295242d7cf.png](https://i-blog.csdnimg.cn/blog_migrate/f3a256bfb58321ae77babbe7317ccb7b.png)
#变量对PC1的贡献
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)
![7755e092bfc77b420c1e42b1cb702320.png](https://i-blog.csdnimg.cn/blog_migrate/8e5fbfa650947291b1024422dd4221c1.png)
#变量对PC2的贡献
fviz_contrib(res.pca, choice = "var", axes = 2, top = 10)
![9275dd022b788ac524b6da3cdfd6e04b.png](https://i-blog.csdnimg.cn/blog_migrate/36b9f2c21d3a6b79ea9ddf60197302b1.png)
#个体的主成分分析结果
ind <- get_pca_ind(res.pca);ind
head(ind$coord)
head(ind$cos2)
head(ind$contrib)
![c6d13350013e2887dc2f984dbeda7c03.png](https://i-blog.csdnimg.cn/blog_migrate/9faf86fd3f4d3656ed804885ecbfc2d1.jpeg)
#使用渐变色
fviz_pca_ind(res.pca, col.ind = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # 避免文本重叠(如果有很多点,速度会很慢)
)
![ef349169f57a95716f65e35809cefa35.png](https://i-blog.csdnimg.cn/blog_migrate/71029aad247081105def13c9c4c34a19.png)
# 个人和变量的图表
fviz_pca_biplot(res.pca, repel = TRUE)
![b949958d8958027a3bc0dd033f5c4b41.png](https://i-blog.csdnimg.cn/blog_migrate/c54606b185a9564e9112025df9fce698.png)
由于decathlon2数据集中的Competition项的分类维度问题,所以选择如下数据集作相应的可视化分析:
#在虹膜数据集上计算PCA
#删除变量Species(索引= 5)
#PCA分析前
iris.pca <- PCA(iris[,-5], graph = FALSE)
#可视化
#使用habillage指定要着色的组
fviz_pca_ind(iris.pca,
label = "none", #隐藏个人标签
habillage = iris$Species, #按组颜色
palette = c("#00AFBB", "#E7B800", "#FC4E07"),
addEllipses = TRUE #浓度椭圆
)
![3909fae18896fc0bc45d541bfbec5b1a.png](https://i-blog.csdnimg.cn/blog_migrate/32efdc814432a0392079aca1b8b704d5.png)
备注:
学习Alboukadel Kassambara的《Practical Guide to Principal Component Methods in R》,仅学习参考用。
参考博客如下:
https://plotly.com/python/v3/ipython-notebooks/principal-component-analysis/plotly.com https://builtin.com/data-science/step-step-explanation-principal-component-analysisbuiltin.com