我如何解释我从 PCA 中得到的信息?

机器算法验证 主成分分析
2022-03-21 19:10:04

作为大学作业的一部分,我必须对一个相当庞大的多变量 (>10) 原始数据集进行数据预处理。我不是任何意义上的统计学家,所以我对发生的事情有点困惑。提前为这可能是一个可笑的简单问题道歉 - 在查看各种答案并试图通过统计数据说话后,我的头在旋转。

我读过:

  • PCA 允许我减少数据的维数
  • 通过合并/删除关联很多的属性/维度来做到这一点(因此有点不必要)
  • 它通过在协方差数据上找到特征向量来做到这一点(感谢我遵循的一个很好的教程来学习这个)

这是伟大的。

但是,我真的很难了解如何将其实际应用于我的数据。例如(这不是我将使用的数据集,而是一个人们可以使用的体面示例的尝试),如果我有一个类似...的数据集

PersonID     Sex     Age Range    Hours Studied     Hours Spent on TV      Test Score     Coursework Score 
1            1       2            5                 7                      60             75
2            1       3            8                 2                      70             85 
3            2       2            6                 6                      50             77
...          ...     ...          ...               ...                    ...            ...

我不太确定我将如何解释任何结果。

我在网上看到的大多数教程似乎都让我对 PCA 有了一个非常数学的看法。我已经对其进行了一些研究并跟进了它们 - 但我仍然不完全确定这对我意味着什么,我只是试图从我面前的这堆数据中提取某种形式的意义。

简单地对我的数据执行 PCA(使用 stats 包)会产生一个 NxN 数字矩阵(其中 N 是原始维度的数量),这对我来说完全是希腊式的。

我如何进行 PCA 并以一种我可以将原始尺寸表达为简单英语的方式获取我得到的东西?

3个回答

您发布的教程的第 13-20 页提供了关于 PCA 如何用于降维的非常直观的几何解释。

您提到的 13x13 矩阵可能是“加载”或“旋转”矩阵(我猜您的原始数据有 13 个变量?)可以用两种(等效)方式之一解释:

  1. 加载矩阵的(的绝对值)列描述了每个变量按比例“贡献”到每个组件的程度。

  2. 旋转矩阵将您的数据旋转到旋转矩阵定义的基础上。因此,如果您有二维数据并将数据乘以旋转矩阵,则新的 X 轴将是第一个主成分,新的 Y 轴将是第二个主成分。

编辑:这个问题被问了很多,所以我只想对我们使用 PCA 进行降维时发生的情况进行详细的视觉解释。

考虑从 y=x + 噪声生成的 50 个点的样本。第一个主成分将位于 y=x 线上,第二个主成分将位于 y=-x 线,如下所示。

在此处输入图像描述

纵横比有点搞砸了,但相信我的话,组件是正交的。应用 PCA 将旋转我们的数据,使组件成为 x 和 y 轴:

在此处输入图像描述

变换前的数据为圆形,变换后的数据为十字。在这个特定的例子中,数据并没有被旋转太多,而是在 y=-2x 线上翻转,但是我们可以很容易地反转 y 轴以使其真正成为旋转而不失一般性,如此处所述.

大部分方差,即数据中的信息,沿着第一个主成分(在我们转换数据后由 x 轴表示)传播。第二个分量(现在是 y 轴)有一点点变化,但我们可以完全删除这个分量而不会丢失大量信息因此,为了将其从二维折叠为 1,我们让数据投影到第一个主成分上完全描述了我们的数据。

在此处输入图像描述

我们可以通过将原始数据旋转(好的,投影)回原始轴来部分恢复原始数据。

在此处输入图像描述

深蓝色点是“恢复”数据,而空点是原始数据。如您所见,我们丢失了原始数据中的一些信息,特别是第二主成分方向的方差。但出于许多目的,这种压缩描述(使用沿第一主成分的投影)可能适合我们的需要。

这是我用来生成此示例的代码,以防您想自己复制它。如果减少第二行中噪声分量的方差,PCA 变换丢失的数据量也会减少,因为数据将收敛到第一个主分量上:

set.seed(123)
y2 = x + rnorm(n,0,.2)
mydata = cbind(x,y2)
m2 = colMeans(mydata)

p2 = prcomp(mydata, center=F, scale=F)
reduced2= cbind(p2$x[,1], rep(0, nrow(p2$x)))
recovered = reduced2 %*% p2$rotation

plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data with principal component vectors')
arrows(x0=m2[1], y0=m2[2]
       ,x1=m2[1]+abs(p2$rotation[1,1])
       ,y1=m2[2]+abs(p2$rotation[2,1])
       , col='red')
arrows(x0=m2[1], y0=m2[2]
       ,x1=m2[1]+p2$rotation[1,2]
       ,y1=m2[2]+p2$rotation[2,2]
       , col='blue')

plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data after PCA transformation')
points(p2$x, col='black', pch=3)
arrows(x0=m2[1], y0=m2[2]
       ,x1=m2[1]+abs(p2$rotation[1,1])
       ,y1=m2[2]+abs(p2$rotation[2,1])
       , col='red')
arrows(x0=m2[1], y0=m2[2]
       ,x1=m2[1]+p2$rotation[1,2]
       ,y1=m2[2]+p2$rotation[2,2]
       , col='blue')
arrows(x0=mean(p2$x[,1])
      ,y0=0
      ,x1=mean(p2$x[,1])
      ,y1=1
      ,col='blue'
       )
arrows(x0=mean(p2$x[,1])
       ,y0=0
       ,x1=-1.5
       ,y1=0
       ,col='red'
)
lines(x=c(-1,1), y=c(2,-2), lty=2)


plot(p2$x, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='PCA dimensionality reduction')
points(reduced2, pch=20, col="blue")
for(i in 1:n){
  lines(rbind(reduced2[i,], p2$x[i,]), col='blue')
}

plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Lossy data recovery after PCA transformation')
arrows(x0=m2[1], y0=m2[2]
       ,x1=m2[1]+abs(p2$rotation[1,1])
       ,y1=m2[2]+abs(p2$rotation[2,1])
       , col='red')
arrows(x0=m2[1], y0=m2[2]
       ,x1=m2[1]+p2$rotation[1,2]
       ,y1=m2[2]+p2$rotation[2,2]
       , col='blue')
for(i in 1:n){
  lines(rbind(recovered[i,], mydata[i,]), col='blue')
}
points(recovered, col='blue', pch=20)

我会说你的问题不仅在cross validated而且在 中都是一个合格的问题stack overflow,在那里你将被告知如何在 R(..etc.) 中实现降维,以有效地帮助你确定哪个列/变量对方差的贡献更好整个数据集。

scalePCA(主成分分析)与 SVD(奇异值分解)具有相同的功能,并且在将z 变换应用于数据集之后,它们实际上是完全相同的过程。

这里有一些资源,你可以在半小时内完成,以便更好地理解。

我无法提供生动的编码解决方案来帮助您了解如何实现 svd 以及每个组件的作用,但是人们很棒,这里有一些非常有用的帖子,我用来赶上 SVD 的应用程序方面,即使我知道如何手动计算 3by3 SVD 问题.. :)

  1. Jeff Leek 的 Coursera 数据分析课程:视频讲座/课堂笔记
  2. 一个非常有用的学生帖子
  3. 美国数学会的一篇文章。

在 PCA 中,您希望用更少的变量来描述数据。与使用所有变量相比,您可以通过更少的变量获得相同的信息。例如,学习时间和考试成绩可能是相关的,我们不必同时包括两者。

在您的示例中,假设您的目标是衡量学生/人的“好”程度。查看所有这些变量,可能会让人困惑如何做到这一点。PCA 让我们能够清楚地看到哪些学生是好/坏的。

如果第一个主成分解释了数据的大部分变化,那么这就是我们所需要的。您会发现该组件与所有变量之间的相关性。“大”相关性表示重要的变量。例如,第一部分可能与学习时间和考试分数密切相关。因此,第一部分的高值表明学习时间和考试分数的高值。