用零数学直观地解释主成分分析(PCA)
主成分分析(PCA)是数据科学可视化和降维不可或缺的工具,但经常被复杂的数学所淹没。这是很困难的,至少可以这么说,让我的脑袋围绕着为什么,这使得我很难欣赏它的全部美丽。
虽然数字对于证明一个概念的有效性很重要,但我认为分享数字背后的故事也同样重要——用一个故事。
什么是PCA?
主成分分析(PCA)是一种将高维数据转换为低维数据的技术,同时保留尽可能多的信息。
主成分分析在处理具有许多特性的数据集时非常有用。常见的应用如图像处理、基因组研究总是要处理成千上万的列。
虽然有更多的数据总是很好的,但有时它们有太多的信息,我们会有不可能的长模型训练时间和维度诅咒这就成了一个问题。有时候,少即是多。
我喜欢将主成分分析与写一本书摘要进行比较。
找时间读一本1000页的书是很少有人能负担得起的奢侈。如果我们能把最重要的观点总结在两三页纸内,这样即使是最忙的人也能很容易地理解这些信息,这不是很好吗?在这个过程中,我们可能会丢失一些信息,但至少我们了解了大局。
PCA是如何工作的?
这是一个两步走的过程。如果我们没有阅读或理解书的内容,我们就不能写一本书的摘要。
PCA以同样的方式工作——理解,然后总结。
通过PCA方法了解数据
人类通过表达性语言来理解故事书的意义。不幸的是,PCA不会说英语。它必须通过它喜欢的语言——数学——在我们的数据中找到意义。
这里最重要的问题是……
- 主成分分析能理解哪部分数据是重要的吗?
- 我们能用数学方法量化数据中所包含的信息量吗?
好吧,方差可以。
方差越大,信息越多。亦然。
对于大多数人来说,方差并不是一个陌生的术语。我们在高中学过,方差衡量的是每个点与平均值的平均差异程度。
但它没有把方差和信息联系起来。那么这种联系是从哪里来的呢?为什么说得通呢?
假设我们正在和朋友玩猜谜游戏。游戏很简单。我们的朋友会遮住脸,我们需要根据他们的身高来猜谁是谁。作为好朋友,我们记得每个人都有多高。
我先说。
毫无疑问,我会说a人是Chris, B人是Alex, C人是Ben。
现在,让我们试着猜一组不同的朋友。
轮到你。
你能猜出谁是谁吗?当他们的身高非常接近时,这是很困难的。
早些时候,我们可以毫不费力地根据身高来区分一个185厘米的人、一个160厘米的人和一个145厘米的人不同很多。
同样地,当我们的数据有更高的方差时,它包含更多的信息。这就是为什么我们总是在同一句话中听到主成分分析和最大方差。我想引用维基百科上的一个片段来正式说明这一点。
PCA被定义为一种正交线性变换,它将数据转换为一个新的坐标系统,使最大方差通过某个标量投影,数据位于第一个坐标上(称为第一主成分),第二个最大方差位于第二个坐标上,以此类推。
在PCA看来,方差是一种客观的、数学的方式来量化我们数据中的信息量。
方差是信息。
为了说明这一点,我建议再来一次猜谜游戏,只是这次,我们要根据身高和体重来猜谁是谁。
第二轮。
一开始,我们只有高度。现在,我们的朋友的数据量增加了一倍。这会改变你的猜测策略吗?
这是一个很好的过渡到下一节- PCA如何总结我们的数据,或者更准确地说,降低维数。
用PCA总结数据
就我个人而言,体重差异是如此之小(也就是一个小差异),这根本不能帮助我区分我们的朋友。我仍然主要依靠身高来猜测。
直观地说,我们刚刚将数据从二维降为一维。我们可以选择性地保留方差大的变量,然后忽略方差小的变量。
但是,如果身高和体重有相同方差吗?这是否意味着我们不能再降低这个数据集的维数了?我想用一个示例数据集来说明这一点。
在这种情况下,很难选择要删除的变量。如果我放弃其中一个变量,我们就放弃了一半的信息。
我们能保持这两个?
也许,换个角度看。
最好的故事书总是有隐藏的主题,不是写出来的,而是隐含.单独阅读每一章是没有意义的。但如果我们通读一遍,它就会为我们提供足够的背景来拼凑谜题——潜在的情节就浮出水面了。
到目前为止,我们只是单独研究身高和体重的方差。与其限制自己只选择其中之一,为什么不把它们结合起来呢?
当我们仔细观察我们的数据时,最大的方差不在x轴上,也不在y轴上,而是在一条对角线上。第二个方差是一条90度的直线,穿过第一个方差。
为了表示这两条线,PCA结合了身高和体重来创建两个全新的变量。可以是30%的身高和70%的体重,或者87.2%的身高和13.8%的体重,或者其他任何组合,这取决于我们所拥有的数据。
这两个新变量叫做第一主成分(PC1)和第二主成分(PC2).我们可以分别使用PC1和PC2,而不是在两个轴上使用高度和重量。
在所有的恶作剧之后,让我们再来看看方差。
PC1单独可以捕获身高和体重组合的总方差。因为PC1拥有所有的信息,所以您已经知道了操作过程——我们可以很轻松地删除PC2,并且知道我们的新数据仍然代表原始数据。
当涉及到真实数据时,通常情况下,我们不会得到一个能够捕捉100%方差的主成分。执行主成分分析将给我们N个主成分,其中N等于原始数据的维数。从这个主成分列表中,我们通常选择能解释最多原始数据的最少的主成分。
一个能帮助我们做决定的视觉辅助工具是小石子的阴谋.
柱状图告诉我们由每个主成分解释的方差的比例。另一方面,叠加折线图为我们提供了到第n个主成分为止的被解释方差的累积和。理想情况下,我们希望用2到3个分量获得至少90%的方差,以便在我们仍然可以在图表上可视化数据的同时保留足够的信息。
看看这个图表,我觉得用两个主要成分比较合适。
逃跑的个人电脑
因为我们没有选择所有的主成分,我们不可避免地会丢失一些信息。但我们还没有确切描述我们失去了什么。让我们用一个新的玩具例子来深入研究这个问题。
如果我们通过PCA模型提供数据,它将从绘制第一主成分开始,然后是第二主成分。当我们将原始数据从二维转换到二维时,除了方向外,其他都保持不变。我们只是旋转数据,使最大方差在PC1。这没什么新鲜的。
然而,假设我们决定只保留第一主成分,我们将不得不将所有数据点投射到第一主成分上,因为我们不再有y轴。
我们将丢失的是第二个主成分中的距离,用下面的红色线突出显示。
这对每个数据点的感知距离有影响。如果我们观察两个特定点之间的欧几里得距离(又称成对距离),你会注意到原始数据中的一些点比转换后的数据远得多。
PCA是一个线性变换,所以它本身不会改变距离,但是当我们开始去维时,距离就扭曲了。
它变得更棘手了——并不是所有的成对距离都受到同样的影响。
如果我们取两个最远的点,你会发现它们几乎平行于主轴。尽管它们的欧几里得距离仍然是扭曲的,但程度要小得多。
原因是主成分轴是朝着方差最大的方向画的。根据定义,数据点之间的距离越远,方差就越大。因此,距离最远的点自然会更好地与主轴对齐。
总而言之,用PCA降低维数会改变数据的距离。它能更好地保持大的成对距离而不是小的成对距离。
这是使用PCA减少维数的少数缺点之一,我们需要意识到这一点,特别是在使用基于欧几里得距离的算法时。
有时,在原始数据上运行算法可能更有益。这就是你作为数据科学家需要根据你的数据和用例做出决定的地方。
毕竟,数据科学既是科学,也是艺术。
用Python实现PCA
除了本文的前提之外,关于PCA还有很多内容。真正欣赏PCA之美的唯一方法就是亲自体验它。因此,我很乐意在这里分享一些代码片段,供任何想要动手的人使用。可以评估完整的代码在这里与谷歌Colab。
首先,让我们完成导入并生成一些我们将使用的数据。
我们的玩具数据集有3个变量——x0、x1和x2,它们的分布方式是聚集在3个不同的集群中。“cluster_label”告诉我们数据点属于哪个集群。
尽可能地将它们形象化总是一个好主意。
数据似乎已经为PCA做好了准备。我们要试着降低它的维度。幸运的是,Sklearn使PCA非常容易执行。尽管我们花了2000多字来解释PCA,但我们只需要3行就可以运行它。
这里有几个活动的部分。当我们将数据拟合到Sklearn的PCA函数时,它完成了所有繁重的工作,返回给我们一个PCA模型和转换后的数据。
该模型使我们能够访问大量的属性,如特征值、特征向量、原始数据的平均值、解释的方差等等。如果我们想了解PCA对我们的数据做了什么,这些是非常有洞察力的。
我想强调的一个属性是pca.explained_variance_ratio_
它告诉我们由每个主成分解释的方差的比例。我们可以用Scree Plot来形象化。
图表告诉我们,使用2个主成分而不是3个主成分是可以的,因为它们可以捕获90%以上的方差。
在此基础上,我们还可以看看创建每个主成分的变量的组合pca.components_ * * 2
.我们可以用热图来展示这一点。
在我们的例子中,我们可以看到PCA1是由34%的x0、30%的x1和36%的x2组成的。PCA2主要由x1支配。
Sklearn还提供了许多更有用的属性。对于那些感兴趣的人,我建议看看PCA的属性部分Sklearn文档.
现在我们对主成分有了更好的理解,我们可以决定我们想要保留的主成分的数量。在这种情况下,我觉得有两个主成分就足够了。
我们可以重新运行主成分分析模型,但这次用的是n_components = 2
参数,它告诉PCA只为我们保留前2个主成分。
这将返回一个包含前两个主要组件的DataFrame。最后,我们可以绘制散点图来可视化我们的数据。
最后的评论
PCA是一个数学上的美丽概念,我希望我能够以一种随意的语气传达它,这样它就不会让人感觉难以承受。对于那些渴望了解实质细节的人,我在下面附上了一些有趣的讨论/资源供您细读。
谢谢你的时间,祝你有愉快的一天。
[1]:中等,法哈德·马利克(2019年1月7日)。什么是特征值和特征向量?
https://medium.com/fintechexplained/what-are-eigenvalues-and-eigenvectors-a-must-know-concept-for-machine-learning-80d0fd330e47
[2]: GitHub。深度:主成分分析
https://jakevdp.github.io/PythonDataScienceHandbook/05.09-principal-component-analysis.html
[3]: StackExchange, whuber(2013年2月21日)。在做主成分分析之前,是否应该去掉高度相关的变量?
https://stats.stackexchange.com/questions/50537/should-one-remove-highly-correlated-variables-before-doing-pca
[4]: StackExchange, ttnphns(2017年4月13日)。主成分分析和方差比例解释https://stats.stackexchange.com/questions/22569/pca-and-proportion-of-variance-explained
[5]: StackExchange,阿米巴(2017年4月13日)。PCA只保留较大的成对距离是什么意思?
https://stats.stackexchange.com/questions/176672/what-is-meant-by-pca-preserving-only-large-pairwise-distances
[6]: StackExchange,阿米巴(2015年3月6日)。理解主成分分析,特征向量和特征值
https://stats.stackexchange.com/questions/2691/making-sense-of-principal-component-analysis-eigenvectors-eigenvalues/140579#140579