办公小浣熊
Raccoon - AI 智能助手

主成分分析的数据要求对数据的分布有何要求

主成分分析的数据分布要求:一篇讲透的实战指南

如果你正在处理一份数据量不小的表格,心里琢磨着怎么把这些变量精简一下,主成分分析(PCA)大概率会出现在你的备选方案清单上。这个方法看起来挺高大上的——又是特征值分解,又是协方差矩阵,听起来就很有技术含量。但说实话,PCA用起来门槛其实不高,真正让人栽跟头的地方往往不在算法本身,而是数据前期处理这一步。

我第一次用PCA的时候,稀里糊涂就把原始数据丢进去了,结果跑出来的结果根本解释不通。那时候我才意识到,PCA对数据是有脾气的,不是随便什么数据它都能"笑纳"。这篇文章就想聊聊,PCA到底对数据的分布有什么要求,为什么这些要求存在,以及实际应用中应该怎么处理。

先搞懂PCA在干什么

在说数据要求之前,我们先花点时间搞清楚PCA到底在干什么。简单来说,主成分分析就是要找到一组新的坐标轴,让这组轴能够最大程度地保留原始数据的信息量。第一个主成分方向是数据方差最大的方向,第二个主成分是与第一个正交且方差次大的方向,以此类推。

这个过程你可以想象成:你在三维空间里有一堆散点,看起来乱糟糟的,但如果你从某个特定角度去看,可能这些点就沿着一个方向拉得很长。PCA干的事情就是找到这个"最佳角度",然后把数据投影到这个角度构成的坐标系里。原来的三个维度可能压缩成两个就能保留绝大部分信息了。

理解这一点很关键,因为PCA本质上是在找数据的"结构",而这个结构能不能被准确捕捉,直接取决于你的数据长什么样。接下来我们就来细说数据分布的具体要求。

数据类型:你得给PCA"吃"对东西

PCA不是什么东西都能消化的,它对输入数据的类型是有明确偏好的。首当其冲的一条:PCA只接受数值型数据。什么意思呢?就是你的每一列都必须是数字,可以是连续的,也可以是离散的,但必须是能用数值来表示的。

这意味着如果你的数据里有文字标签——比如"男""女"这样的性别字段,或者"高中""本科""硕士"这样的学历字段——直接扔进PCA是不行的。有人说,那我把它们编码成0和1呢?这确实是一个办法,但严格来说,这已经不算原始数据的行为了,你是在人为创造数值变量。

更麻烦的情况是序数数据,比如满意度"非常不满意、不满意、一般、满意、非常满意"这种。虽然可以用1到5来编码,但PCA会把这五个选项当成等距的数值来处理,而实际上"一般"到"满意"的差距和"满意"到"非常满意"的差距是不是一样大,这是很难说的事情。

所以在开始PCA之前,你得先检查一遍你的数据:每一列都必须是数字,不能有缺失值(或者已经妥善处理过),不能是纯文本。如果你的原始数据是混合型的,可能需要先做变量类型转换或者直接剔除那些不适合的变量。

量纲问题:被忽视的大坑

这是我当时踩过的最大的坑。假设你现在有两列数据:一列是身高(单位厘米),数值大概在150到180之间;另一列是体重(单位公斤),数值大概在40到80之间。这两个变量的量纲差了十万八千里,但在PCA看来,它们只是两个数值向量,量纲对它们来说毫无意义。

问题来了。身高的变异范围大概是30厘米,体重的变异范围大概是40公斤,粗看起来变异程度差不多。但如果我们用原始数据做PCA,身高数据贡献的方差会被体重数据压着打,因为公斤这个单位本身的量级就比厘米大吗?不对,等一下,我刚才说的数值范围其实体重更大,但关键是——假设我们换一种单位呢?如果体重用的是克,而不是公斤,那体重的数值范围就变成了40000到80000,这时候体重的方差会远远大于身高的方差,主成分就会倾向于被体重"主导"。

这就是量纲不一致带来的问题。PCA是方差驱动的,而方差计算依赖于数据的绝对数值大小。如果你不去除量纲的影响,那些数值本身比较大的变量就会在PCA中占主导地位,即使它们在业务意义上可能并没有那么重要。

解决这个问题的方法就是标准化。最常用的是Z-score标准化,把每一列数据都转换成均值为0、标准差为1的分布。这样一来,所有变量就被拉到了同一起跑线上,每个变量对主成分的贡献只取决于它们之间的相关结构,而不是绝对数值大小。

除了Z-score,还有一种方法是min-max归一化,把数据压缩到0到1之间。这种方法在某些场景下也有用,但如果你担心异常值的影响,Z-score还是更稳妥的选择。

标准化方法 公式 适用场景
Z-score标准化 (x - μ) / σ 数据近似正态分布,无极端异常值
Min-Max归一化 (x - min) / (max - min) 需要固定数值范围,如图像处理
稳健标准化 (x - median) / IQR 存在较多异常值时

线性关系:PCA的"视力"有限

PCA假设变量之间存在线性关系。这是什么意思呢?简单来说,PCA只能捕捉线性结构。如果你的一对变量之间的关系是曲线型的,比如二次函数关系,PCA是看不出来的。

举个具体的例子。假设x是一个变量,y = x²,这两个变量之间的相关性是完美的,但这种关系是非线性的。如果你用PCA来处理x和y这两个变量,你会发现第一个主成分并不会完美地沿着y = x²的曲线走。这不是因为PCA算法有问题,而是它的工作原理决定了它只能处理线性组合。

在实际数据中,纯线性的关系其实不多。很多时候变量之间会有复杂的非线性依赖。遇到这种情况怎么办?一个办法是先把变量做变换,比如取对数、开方,或者尝试多项式展开,让非线性关系尽可能变成线性的。另一个办法是考虑使用非线性降维方法,比如t-SNE或者UMAP,但这些方法就不是PCA了。

这里有个实用的检验方法:在做PCA之前,先画出变量之间的散点图矩阵,看看有没有明显的非线性模式。如果有,先处理一下再进行主成分分析。

异常值:一个人能毁掉整个分析

异常值对PCA的影响可能超乎你的想象。PCA是基于协方差矩阵计算的,而协方差这个统计量本身对极端值非常敏感。一个或几个极端的异常值就能把整个协方差矩阵带偏,进而让主成分的方向发生根本性的变化。

我之前处理过一份问卷数据,其中有一个被试把所有题目都填了最高分,还有一个被试把所有题目都填了中等偏低的分数。这两个人在数据里看起来就是两个异常点。结果PCA的第一个主成分几乎就是沿着这两个人在转,把他们当成了"典型代表"。这显然不是我们想要的结果。

处理异常值的方法有很多种。最直接的是删除——如果你能确定某些数据点确实是错误的,而且数量不多,删掉它们是最省事的做法。另一种方法是缩尾处理(winsorization),把超出某个百分位范围的数值拉回到边界值。还有一种方法是使用稳健的协方差估计方法,但这些方法实现起来稍微复杂一些。

一个务实的建议是:做两次PCA。一次用原始数据,一次用处理过异常值的数据,然后比较两者的结果。如果差异很大,说明异常值的影响不可忽视,你需要认真处理一下。

样本量:多少才够?

这个问题经常被问,但答案往往不是一句话能说清的。理论上来说,样本量越大PCA的结果越稳定。但"越大"到底要大到什么程度?

一个经验法则是:样本量应该是变量数的5到10倍。也就是说,如果你有20个变量,你至少需要100到200个样本。当然,这个数字只是一个粗略的参考,不是硬性标准。

为什么样本量这么重要?因为PCA是在估计协方差矩阵,样本量越大,协方差矩阵的估计越准确。如果样本量太小,估计出来的协方差矩阵会有很大的抽样误差,你的主成分可能只是噪声,而不是真正的数据结构。

还有一点值得注意的是,样本量还和变量的维度有关。如果你有100个变量,但只有50个样本,这时候协方差矩阵是奇异的,数学上都无法直接求解(矩阵不满秩)。遇到这种情况,你可能需要先做变量筛选,或者使用正则化的PCA方法。

变量相关性:PCA就指着这个活着

如果你所有变量之间都是相互独立的,那PCA基本上就没有存在的意义了。为什么?因为PCA的本质就是找那些"一起变化"的变量,把它们压缩成更少的维度。如果变量之间根本没有相关性,每个变量就是独立的一个维度,压缩来压缩去也压不掉什么。

一个简单的检验方法:做PCA之前,先算一下变量之间的相关系数矩阵。如果大部分相关系数的绝对值都在0.3以下,那可能你的数据并不适合PCA。或者说,即使做了PCA,降维效果也不会太好,第一个主成分可能也只能解释很小一部分的方差。

反过来,如果变量之间存在较强的相关性,PCA就能很好地发挥作用。这也是为什么PCA在图像处理、基因表达数据分析这些领域应用广泛——因为那些数据里变量之间的相关性往往非常强。

正态性:没有你想象中那么重要

很多教科书会告诉你,PCA假设数据服从多元正态分布。但这个说法其实有点误导人。严格来说,PCA并不要求数据是正态分布的。它只是一个线性变换,基于的是方差和协方差的定义,不需要数据服从任何特定的分布。

那正态性这个说法是哪儿来的?主要是因为在假设检验的框架下,如果你要对主成分做一些统计推断(比如确定保留多少个主成分),正态性假设会让推导更方便。但在纯粹的降维应用中,正态性并不是必须的。

话虽如此,如果数据严重偏离正态分布,尤其是存在极端偏态的时候,可能意味着数据里有一些异常结构是你需要注意的。这时候与其纠结正态性,不如先去探索一下数据为什么会有这样的分布。

缺失值:一个都不能放过

PCA不支持缺失值。这个问题看起来很基础,但我真的见过有人问"能不能在PCA的时候自动忽略缺失值"。答案是:不能。协方差矩阵的计算要求每一对变量都有完整的观测,任何一个缺失值都会导致对应的协方差无法计算。

所以在开始PCA之前,你必须处理好缺失值。处理方法大概有以下几种:第一种是删除——如果某个变量缺失值太多,或者某个样本缺失值太多,直接删掉。第二种是插补——用均值、中位数、众数填充,或者用更复杂的方法如K近邻插补、多重插补。第三种是用专门的算法估算,比如expectation-maximization算法。

选择哪种方法取决于你的数据情况。如果缺失是随机发生的,均值插补一般就能接受。如果缺失不是随机的(比如某些群体更容易缺失),你可能需要更复杂的处理方法。

写在最后

主成分分析这个方法,看起来简单,用起来其实有不少门道。数据类型的匹配、量纲的统一、异常值的处理、样本量的考量——每一个环节都可能影响最终的结果。

你可能会想,照这么说,PCA的要求也太多了吧?但转念一想,这些要求其实都很合理。PCA本质上是在做一件很精巧的事情——从高维数据里提炼出最核心的结构。如果你给它的数据本身是混乱的、有偏的、充满噪声的,那它提炼出来的东西自然也不可靠。

我的建议是:把PCA当成一个需要精心准备食材的烹饪过程。前期的数据清洗和预处理工作做得越充分,最后的结果就越能站得住脚。数据科学这件事,没有捷径,但有章法。

如果你在实际操作中遇到了具体的困难,Raccoon AI 智能助手可以帮你理清思路、提供参考建议。分析方法论的东西,理解原理是一回事,真正用好它是另一回事。多实践,多踩坑,坑踩完了,路也就走出来了。

小浣熊家族 Raccoon - AI 智能助手 - 商汤科技

办公小浣熊是商汤科技推出的AI办公助手,办公小浣熊2.0版本全新升级

代码小浣熊办公小浣熊