我如何解释我从PCA中获得的收益?


14

作为大学任务的一部分,我必须对相当庞大的多元(> 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(使用统计数据包)会吐出一个NxN的数字矩阵(其中N是原始维数),这对我来说完全是希腊文。

如何进行PCA并采用我可以用原始尺寸换算成普通英语的方式得到的结果?


3
您的示例数据显示了多种数据类型的混合:性别是二分法,年龄是序数,其他3个是区间(并且它们以不同的单位表示)。对间隔数据进行线性PCA是正确的(但是由于单位,您必须首先对这些变量进行z标准化)。对于二进制数据还是二分数据,PCA是合适的还是有争议的。您不应在线性PCA中使用序数数据。但随着你的榜样数据的主要问题:为什么在所有用它做PCA; 在这种情况下有什么意义?
ttnphns

该pdf 对PCA应用很有用。这里的其他帖子在描述PCA结果的“含义”方面做得很好。
AMS

(如果我错了,请纠正我)我相信PCA在/有助于发现数据趋势并找出哪些属性可以与哪些相关(我想最终可以弄清楚)方面非常有用。样式等)。我的作业详细说明了我拥有如此庞大的数据集,我只需要应用聚类和分类器,而PCA就是它对预处理至关重要的步骤之一。如果我试图从数据集中提取一些二阶属性,将其全部获取到区间数据中,将会有帮助吗?
nitsua

3
目前,我只能建议您阅读有关PCA的更多信息(也可以在此站点上阅读)。许多不确定性肯定会消失。
ttnphns

上面有很多不错的链接,这是一个简短的示例,“可以”从回归的角度使您对PCA有了一个很好的了解,并提供了一个实际的示例,并且很少(如果有的话)是技术术语。sites.stat.psu.edu/~ajw13/stat505/fa06/16_princomp/…–
leviathan

Answers:


15

您发布的教程的第13-20页提供了非常直观的几何解释,说明了如何使用PCA进行降维。

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

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

  2. 旋转矩阵将数据旋转到旋转矩阵定义的基础上。因此,如果您具有2-D数据并将数据乘以旋转矩阵,则新的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)

5
David,请避免互换使用术语“旋转矩阵”(又称特征向量)和“加载矩阵”。为了纯洁而不误导人。PCA中的载荷是通过特征值归一化的特征向量。谢谢。
ttnphns

3
@ttphns我认为这完全取决于您使用的软件包。这些术语通常是完全可以互换的。在此处考虑“负载”的用法:utdallas.edu/~herve/abdi-awPCA2010.pdf。还要参考R函数prcomp,其中荷载矩阵只是其列为单位特征向量的矩阵。我认为您是不必要的技术人员,在大多数情况下,我认为这些术语可以互换使用。
大卫·马克思

4
对不起,但我不同意。原因:请记住,加载量对于PCA和因子分析都是有意义的(并且意义相同!)。载荷可以直接与相关性/协方差进行比较。特征向量是旋转余弦。在因子分析中,许多方法不处理旋转(提取阶段)。因此,将两个术语混用确实会误导学生,应避免使用。
ttnphns

小点:正确的拼写始终是“原理”,而不是“原理”。我已经进行了相应的编辑,但是无法编辑一张图像。
Nick Cox

1
可以在此处找到另一种视觉效果setosa.io/ev/principal-component-analysis
SIslam

2

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

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

这里有一些资源,您可以在半小时内进行深入了解。

我没有能力提供生动的编码解决方案来帮助您了解如何实现svd以及每个组件的功能,但是人们真是棒极了,这里有一些非常有用的文章,即使我使用SVD的应用程序,我也可以使用它们。知道如何手工计算3by3 SVD问题.. :)

  1. Jeff Leek的Coursera数据分析课程:视频讲座 / 课程笔记
  2. 一个非常翔实的学生职位
  3. 美国数学协会的帖子。

Jeff Leek的课程非常有助于您理解PCA的功能。好处是,它不会涉及复杂的数学/统计细节(可以在许多其他地方找到),而是提供了动手实践的方法来展示如何在数据上真正使用它。
nico

1

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

在您的示例中,假设您的目标是衡量学生/人的“好”程度。查看所有这些变量,看到如何执行此操作可能会造成混淆。PCA使我们可以清楚地看到哪些学生的好/不好。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.