PCA, Factor Analysis and Varimax
本文由 Claude Code 生成。目标读者:只有最基础的数学(知道平均数、会一点点向量与矩阵就够)。我们从“词汇假说”这个心理学问题出发,一步步把主成分分析(PCA)、因子分析(factor analysis)与 Varimax 旋转讲清楚:不只给公式,更解释每一步的原理与直觉,看看人们究竟是怎么从一堆人格形容词里“找出”大五这样的人格维度的。
我们到底想干什么
人格特质研究有一条古老的直觉,叫词汇假说(lexical hypothesis):人类生活中真正重要的个体差异,迟早会被编码进日常语言,沉淀成一个个形容词。Galton 最早提出这一想法,Allport 与 Odbert(1936)从英语词典里清点出约 18,000 个描述人的词(参见本博客的 Personality Traits 一篇)。
问题随之而来。这么多词,彼此其实高度重叠:“外向、健谈、合群、热情、爱社交”几乎在说同一件事。如果让很多人按这些词逐一给自己打分(比如 1 到 7 分),你会发现这些词的分数总是一起高、一起低。这提示我们:表面上有几百个词,背后真正起作用的“维度”也许只有少数几个。
于是整件事变成一个数据压缩问题:
核心目标. 给定一张“人 × 词”的大评分表,里面很多列在重复地说同一件事,我们想找出少数几个互不重复的“超级维度”,既能尽量保住原表里的信息,又能被人读懂、命名(于是有了大五 OCEAN)。
完成这件事的主力工具有两个:PCA(主成分分析)和因子分析,外加一个让结果变得可解释的收尾动作:Varimax 旋转。下面从最基础的直觉开始,把它们一件件讲透。
第一步:把直觉打好(方差、相关、“方向”)
方差 = 散开的程度. 一列分数(比如所有人在“外向”上的打分),它的方差(variance)衡量这些分数散得有多开。都挤在平均值附近,方差小;有人很高有人很低,方差大。直觉上,方差大的地方信息多:如果一个问题所有人答得一模一样,它就区分不出人;只有大家答得不一样,它才“有用”。
相关 = 两列是否一起动. 两列分数之间的协方差(covariance)/相关(correlation)衡量它们是不是一起涨落。“外向”高的人“健谈”也高 → 正相关;“外向”高的人“内省”反而低 → 负相关;两者毫无关系 → 相关约为 $0$。相关就是词汇假说能落地的关键:正因为很多词彼此强相关,我们才有“压缩”的空间。
直觉. 把每个人想成一个点。如果只看“外向”和“健谈”两列,每个人就是平面上的一个点 $(x,y)$。这些点不会乱铺一地,而是会沿一条斜线挤成一个斜椭圆形的点云(因为两者正相关)。点云越“瘦长”,两列越相关,真正独立的信息就越少。
先标准化. 不同词的打分尺度可能不同,所以通常先把每一列中心化(减去该列平均值,让平均为 $0$),再除以该列标准差(让散度为 $1$)。处理完之后,两列之间的协方差就等于它们的相关系数。人格研究几乎总是从这张相关矩阵出发。
几何图景(全文的总纲). 把每个人看成一个高维空间里的点:有 $p$ 个词,就是 $p$ 维空间里的一个点。$n$ 个人就是一大团点云。由于很多维高度相关,这团点云并不是各方向均匀的圆球,而是一个被压扁、拉长的椭球:它在某些方向上拉得很长(那里人和人差异大),在另一些方向上薄得几乎是一片(那里大家几乎一样)。PCA 要做的,就是找出这个椭球被拉得最长的几个方向。 抓住这几个方向,就抓住了人群中绝大部分的差异。
第二步:找“方差最大的方向”
先把“方向”这个词说清楚。在我们这里,一个方向就是一套给原始变量配的权重 $w=(w_1,\dots,w_p)$,它把 $p$ 个词的分数线性地揉成一个新分数:
\[\text{新分数}=w_1\cdot(\text{词}_1\text{的分})+\cdots+w_p\cdot(\text{词}_p\text{的分}).\]比如 $w$ 在“外向、健谈、合群”上权重大、别处接近 $0$,那么这个新分数就近似是一个“社交性”综合分。为了让不同方向公平可比,我们要求权重向量长度为 $1$,即 $w_1^2+\cdots+w_p^2=1$(记作 $w^\top w=1$)。
把每个人的数据沿方向 $w$ 揉成一个新分数,在几何上就是把每个点投影到方向 $w$ 上(取它在这条轴上的“影子”)。现在的核心问题是:
该挑哪个方向? 挑让这些新分数最散开的方向,也就是投影方差最大的方向。因为前面说过,方差越大,这个综合维度越能把人和人区分开,保住的信息越多。
把“投影方差”写成公式. 设标准化后数据的协方差(相关)矩阵是 $S$。可以证明,沿方向 $w$ 的新分数的方差正好是
\[\mathrm{Var}(\text{新分数})=w^\top S w.\]这一步别被吓到,它只是“加权和的方差”展开。以两个变量为例,新分数 $=w_1 X_1+w_2 X_2$,按方差的基本性质,
\[\mathrm{Var}(w_1X_1+w_2X_2)=w_1^2\mathrm{Var}(X_1)+w_2^2\mathrm{Var}(X_2)+2w_1w_2\mathrm{Cov}(X_1,X_2),\]把右边按矩阵收起来,正是 $w^\top S w$(其中 $S$ 的对角是各自方差、非对角是协方差)。变量再多也是同一个式子的推广。
于是问题被干净地写成一个带约束的最大化:
\[\max_{w}\ w^\top S w\qquad \text{约束 } w^\top w=1.\]第三步:这个方向是谁?特征向量登场
要解上面的最大化,先认识两个词:特征向量(eigenvector)与特征值(eigenvalue)。它们听起来吓人,直觉其实很朴素。
直觉:矩阵是“作用”,特征向量是不被转弯的方向. 矩阵 $S$ 可以“作用”在一个向量上,把 $v$ 变成 $Sv$。对大多数方向,$Sv$ 会既被拉伸又被转向(指向变了)。但有一些特殊方向,$S$ 作用上去只把它拉长(或缩短),方向不变,即 $Sv=\lambda v$;这样的 $v$ 就是特征向量,拉伸倍数 $\lambda$ 就是特征值。对协方差矩阵来说,这些特殊方向恰恰就是那团点云椭球的主轴,而对应的特征值 $\lambda$ 就是点云沿这条主轴的方差(散度)。
有了这个图景,答案几乎呼之欲出:点云被拉得最长的方向,就是最大特征值对应的特征向量。下面把它严格地推出来,顺便看清为什么。
用 Lagrange 乘子(温柔版). 我们要在“单位长度”这个约束下最大化 $w^\top S w$。Lagrange 乘子法的思路是:把约束用一个待定数 $\lambda$ 挂进目标,构造
\[\mathcal{L}(w,\lambda)=w^\top S w-\lambda\,(w^\top w-1),\]然后在它的“平地”(对 $w$ 的梯度为零)处找解。对 $w$ 求梯度并令其为零:
\[\nabla_w\mathcal{L}=2Sw-2\lambda w=0\ \Longrightarrow\ Sw=\lambda w.\]这一步的直觉. 想象你站在单位球面上,要爬到 $w^\top S w$ 最高的点。$w^\top S w$ 的“上坡方向”是 $2Sw$。如果在某点,这个上坡方向还有沿球面的分量,你就还能再往上走、说明没到顶。所以到顶时,上坡方向必须完全垂直于球面,也就是沿着 $w$ 本身的方向 → $Sw$ 与 $w$ 平行 → $Sw=\lambda w$。一句话:约束最优点处,目标的梯度只能径向指出去。 这正好逼出特征向量方程。
把 $Sw=\lambda w$ 代回目标,得 $w^\top S w=w^\top(\lambda w)=\lambda\,(w^\top w)=\lambda$。也就是说:
关键结论. 候选的最优方向都是 $S$ 的特征向量;而沿某个特征向量的投影方差恰好等于它的特征值 $\lambda$。要让方差最大,就取最大特征值对应的特征向量。这个方向就是第一主成分(first principal component, PC1)。
第四步:后续主成分、保留几个、解释了多少
第二、第三主成分. 抓住 PC1 后,人群在这个方向上的差异就“解释掉了”。我们接着在与 PC1 垂直的所有方向里,再找方差最大的那个,就得到 PC2;再垂直于前两者找 PC3,以此类推。数学上,这等价于把 $S$ 做特征分解,把全部特征向量按特征值从大到小排好:
\[S=\sum_{k=1}^p\lambda_k\,w_k w_k^\top,\qquad \lambda_1\ge\lambda_2\ge\cdots\ge\lambda_p\ge 0.\]每个主成分给每个人算出一个得分 $z_k=Xw_k$(把数据投影到第 $k$ 个方向),不同主成分的得分互不相关,这正是我们要的“互不重复的维度”。
每个主成分解释了多少方差. 所有特征值之和等于总方差($\lambda_1+\cdots+\lambda_p=\operatorname{tr}(S)$,即各变量方差之和)。所以第 $k$ 个主成分解释的方差比例是
\[\frac{\lambda_k}{\sum_{j=1}^p\lambda_j}=\frac{\lambda_k}{\operatorname{tr}(S)}.\]直觉. 特征值就是“这个方向上有多少信息”的度量。前几个特征值往往很大、迅速变小,意味着少数几个方向就装下了大部分差异,这正是词汇假说所预言的:几百个词背后只有少数几个维度。
该保留几个主成分? 几条常用经验法则:
- Kaiser 准则:保留特征值大于 $1$ 的成分。直觉:用的是相关矩阵时,一个原始变量的方差正好是 $1$;一个主成分若连“一个变量那么多信息”都装不下($\lambda<1$),就不值得单列。
- 碎石图(scree plot):把特征值从大到小画出来,曲线常常先陡降、再变平;在那个“肘部”截断,平台之后的多半是噪声。
- 平行分析(parallel analysis):把真实特征值和“纯随机数据”产生的特征值比,只保留明显高于随机水平的成分,最稳健。
在人格数据上,这些准则常常一致地指向约 5 个维度。
和 SVD 的关系(计算备注). 实际算的时候,常不直接对 $S$ 做特征分解,而是对(中心化的)数据矩阵 $X$ 做奇异值分解(SVD)$X=U\Sigma V^\top$。可以验证 $X^\top X=V\Sigma^2 V^\top$,所以主成分方向就是右奇异向量 $w_k=v_k$,特征值 $\lambda_k=\sigma_k^2/(n-1)$,主成分得分就是 $XV=U\Sigma$。这只是数值上更稳的同一件事,不影响理解。
第五步:PCA 还不够诚实,因子分析
到这里我们已经能把几百个词压成几个主成分了。但 PCA 有个“哲学”上的小问题:它把每个词里的全部变异(包括只属于这个词的怪癖、还有测量误差)都一股脑塞进主成分。而人格研究真正想问的是另一件事:
更诚实的问法. 是不是存在少数几个看不见的“公共因子”(比如某种“外向性”),它们在背后同时牵动着一大批词?每个词 = 这些公共因子的某种混合 + 一份只属于这个词自己的成分。
这就是公共因子模型(common factor model)。把一个人的 $p$ 个词分数写成向量 $x$:
\[x=\mu+\Lambda f+\varepsilon,\qquad \Sigma=\Lambda\Lambda^\top+\Psi.\]逐块读:$\mu$ 是各词的平均;$f\in\mathbb{R}^m$ 是 $m$ 个公共因子(看不见的“超级维度”,设它们均值 $0$、方差 $1$、互不相关,即 $\mathrm{Cov}(f)=I_m$);$\Lambda\in\mathbb{R}^{p\times m}$ 是因子载荷(factor loadings)矩阵,$\Lambda$ 的第 $i$ 行告诉你“第 $i$ 个词由各因子按什么比例混成”;$\varepsilon$ 是独特因子(unique factor),即每个词自己的怪癖加噪声,$\mathrm{Cov}(\varepsilon)=\Psi$ 是对角阵(各词的怪癖互不相关)。
右边的 $\Sigma=\Lambda\Lambda^\top+\Psi$ 是这个模型对“词与词之间相关矩阵”的预测:词之间之所以相关,正是因为它们共享了公共因子($\Lambda\Lambda^\top$ 这一项);各自的怪癖 $\Psi$ 只待在对角线上,不制造相关。
PCA 与因子分析的根本区别(务必记住). PCA 解释全部方差,不区分“共享的”还是“独有的”;因子分析把共同变异($\Lambda\Lambda^\top$)与独特变异($\Psi$,含误差)分开,只用公共因子去解释“词之间为什么相关”。人格维度严格说应当是公共因子,PCA 只是它的一个常用近似。
共同度. 一个词 $i$ 被公共因子解释掉的那部分方差,叫它的共同度(communality)$h_i^2=\sum_{j=1}^m\lambda_{ij}^2$(把这一行各载荷平方相加);剩下的 $\psi_i$ 是它的独特度,$\sigma_{ii}=h_i^2+\psi_i$。载荷 $\lambda_{ij}$ 可以读作“第 $i$ 个词与第 $j$ 个因子的相关”,这正是我们最后要解释、命名的那张表。
第六步:为什么因子不唯一,以及“旋转”
因子分析有一个让初学者意外、却恰恰是关键的性质:因子载荷不是唯一的。
取任意一个正交矩阵 $R$(它代表一次“旋转或翻转”,满足 $R^\top R=I_m$),令 $\Lambda^\ast=\Lambda R$,则
\[\Lambda^\ast\Lambda^{\ast\top}=\Lambda RR^\top\Lambda^\top=\Lambda\Lambda^\top.\]也就是说,旋转后的载荷 $\Lambda^\ast$ 对相关矩阵 $\Sigma$ 的预测和原来一模一样。两套不同的载荷,拟合得一样好。
直觉. 公共因子就像你给点云架的几根坐标轴。你可以把这几根轴整体转一个角度,每个点的实际位置没变、它们之间的关系(相关)也没变,变的只是“每个点在新轴上的坐标读数”。既然怎么转都同样合身,那我们就主动挑一个最好解释的转法。这就是“旋转”的全部动机:把自由度用在可解释性上。
该转到哪?简单结构. Thurstone 提出一个判读“好不好解释”的标准,叫简单结构(simple structure):每个词最好只在少数(理想是一个)因子上载荷很高,在其余因子上接近零;反过来每个因子也只由一簇词高载荷地“指认”出来。这样每个因子的含义就清清楚楚:看哪一簇词在它上面亮起来就行。
画面. 把每个词画成“载荷平面”上的一个点(横坐标是它在因子 1 上的载荷,纵坐标是因子 2 上的)。简单结构,就是希望这些点尽量贴着坐标轴分布(要么靠横轴、要么靠纵轴),而不是斜飘在中间。旋转坐标轴,就是为了把这些点尽量“对齐”到轴上。
第七步:Varimax,把载荷推向“非高即零”
Varimax(Kaiser, 1958)是最常用的一种正交旋转,它把上面“贴着轴”的愿望写成了一个可以最大化的量。
它的想法是:让每个因子(载荷矩阵的每一列)里,“平方载荷”的方差尽量大。为什么这就对应简单结构?因为一列数,只有当它有的很大、有的接近零时,方差才大;如果一列里全是“不大不小”的中间值,方差就小。所以“让每列平方载荷方差最大”,正是在逼着每个因子的载荷走向两极(接近 $0$ 或接近 $\pm 1$)。用平方,是因为我们只在意载荷的大小、不在意正负号。
写成公式,Varimax 的(原始)目标函数是
\[V=\sum_{j=1}^m\left[\frac{1}{p}\sum_{i=1}^p \lambda_{ij}^4-\left(\frac{1}{p}\sum_{i=1}^p \lambda_{ij}^2\right)^2\right],\]方括号里正是第 $j$ 列平方载荷 $\lambda_{ij}^2$ 的方差(平方的平均,减去平均的平方);把各列加起来要它最大。实践中还常用 Kaiser 归一化:先把每行除以该行共同度 $h_i$(让共同度大小不同的词同等出力),旋转完再乘回。
旋转不改变拟合,只重新分配载荷. 因为我们只在正交旋转里挑($\Lambda^\ast=\Lambda R$),前面已证 $\Lambda^\ast\Lambda^{\ast\top}=\Lambda\Lambda^\top$,所以模型对相关的拟合一点没变;而且每个词的共同度也不变,正交旋转保持每一行的长度,即 $h_i^{\ast 2}=\lVert R^\top \lambda_{i\cdot}\rVert^2=\lVert \lambda_{i\cdot}\rVert^2=h_i^2$。变的只是“这个词的那点共同方差,在各因子之间怎么分”。Varimax 把它尽量集中到一个因子上。
怎么真的转(算法). 旋转可以一对因子、一对因子地做。对某一对因子(两列载荷),用归一化后的 $x_i=\lambda_{i1}$、$y_i=\lambda_{i2}$,定义两个辅助量
\[u_i=x_i^2-y_i^2,\qquad v_i=2x_iy_i,\]那么使 Varimax 准则最大的旋转角 $\theta$ 有闭式公式(Kaiser):
\[\tan(4\theta)=\frac{2\big[\,p\sum_i u_iv_i-(\sum_i u_i)(\sum_i v_i)\,\big]}{p\sum_i (u_i^2-v_i^2)-\big[(\sum_i u_i)^2-(\sum_i v_i)^2\big]},\]对应的旋转矩阵是
\[R=\begin{pmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{pmatrix}.\]你不必记这个公式,它只是把“这一对因子转到哪个角度最简单”算了出来。因子多于两个时没有一步到位的解,就遍历每一对因子、各自转到它的最佳角度,扫一遍叫一轮,反复扫到不再变化为止。每一步都不会让 $V$ 变小,所以一定收敛到一个(局部)最优的简单结构。
第八步:于是,大五出现了
把这一整套(标准化 → 提取因子 → Varimax 旋转)用到人格形容词的大规模评分数据上,反复浮现的结果是约五个清晰、可命名的因子,也就是大五人格(Big Five / OCEAN):开放性(Openness)、尽责性(Conscientiousness)、外向性(Extraversion)、宜人性(Agreeableness)、神经质(Neuroticism)。从 Tupes 与 Christal(1961)、Norman(1963)到 Goldberg 的词汇学研究,都在不同样本、不同词表里复现出这一结构。这种跨样本的可复现,正是大五被当作稳健“描述性框架”的统计底气。
几条要记在心里的边界
- PCA 不等于因子分析. PCA 是换坐标加降维、解释总方差;因子分析是潜变量模型、区分共同与独特方差。人格维度严格说来自因子分析,PCA 常作近似,两者在小样本或共同度低时结论可能不同。
- 旋转是一种“选择”,不是“发现”. 简单结构只是为了可解释的启发式;Varimax 给的是正交解(因子之间被强行设为不相关)。但现实里“外向”和“宜人”可能本就相关,这时该用斜交旋转(oblique,如 Promax、Oblimin),得到的因子允许相关,结论也会不同。选哪种旋转本身就是一个判断。
- 维度是被“造”出来的描述,不是被“发现”的本质. 因子的数目、旋转方法、词表与样本(乃至语言文化)都会影响结果。大五是对相关结构的一个简洁、好用的概括:它描述了人与人怎么不同,但并不直接解释这些不同从何而来(基因?环境?)。“能压缩、能预测”永远不等于“已经解释”,这一点,和人格特质研究一贯的告诫完全一致。