主成分分析(Principal Component Analysis,PCA)的个人理解
作为主成分分析学习的笔记,方便理解与复习。
一.主成分分析简介
主成分分析(PCA)是一种通过线性变换,将原始数据投影到一组按方差从大到小排列的、线性不相关的新坐标轴(称为主成分)上,从而得到一组新数据(称为主成分得分),以便于实现数据降维和特征提取的统计方法。
PS:这里的主成分可以理解为坐标轴,由主成分张成的空间才是坐标系。
1.核心思想与工作方式
主成分分析是一种经典的无监督线性降维技术。
-
核心思想:通过一个线性变换,将原始可能存在相关性(统计学中的相关性)的多个变量,转换为一组数量更少的、线性不相关(向量空间上的线性无关)的新变量,这些新变量被称为主成分得分,它是原来的特征向量在主成分这个坐标轴上的投影。
-
工作方式:
PCA通过以下步骤构建一个新的坐标系:
寻找第一个基向量:PCA寻找一个穿过数据云中心(均值点)的向量方向,使得当所有数据点投影到该向量上时,投影值的方差达到最大。这个方向所代表的向量,被定义为第一主成分,它将作为新坐标系的第一个坐标轴。
寻找后续基向量:接着,PCA寻找与之前找到的所有主成分向量都正交(即内积为零) 的下一个方向,并且在此约束下,使得数据在该方向上的投影方差尽可能大。这个方向所代表的向量,被定义为第二主成分,成为新坐标系的第二个坐标轴。此过程重复进行,直至找到所有主成分。
PS:PCA是有损的吗?
需要注意的一点是,PCA本身的数学变换方法是一个无损的计算,这个变换过程是可逆的,信息损失来自于后续的“决策”而非“方法本身”,比如当我们执行降维的操作,主动选择只保留前k个主成分,而丢弃剩余的 (n-k) 个时,信息损失才发生。
PS:PCA是怎么确定主成分的?
主成分分析的有效性基于一个核心假设:数据的方差越大,其包含的信息量就越多。基于此,该方法通过前文提到的工作方式找到所有的主成分,组成一个主成分坐标轴,最终,PCA输出一组按信息量(即方差)从大到小排列的新综合特征。由于这个排序直接反映了各成分的信息含量,因此在降维时,我们可以舍弃后方信息量较小的主成分,从而在减少数据维度的同时,最大程度地保留原始数据中的主要信息。
2.目的
①降维:
在尽可能保留原始信息的前提下,减少数据的变量数目,这是PCA最直接、最功利的作用,其核心目标是解决“维度灾难”。
举个例子来说,假设训练数据包含100个特征,通过PCA可以创建出一组数量同样为100个的综合特征(也就是主成分),这些主成分按照所包含的信息量(方差)从大到小排序,保留前面信息量最大的几个特征,就可以达到降维的目的,同时保留尽可能多的信息量。
②去冗余:
消除原始变量之间可能存在的相关性,使生成的新变量(主成分)彼此独立。
举个例子来说,假设收集的数据包括一个人的身高、体重、鞋码这三个特征,通常来说,身高越高的人,体重越大,鞋码也应该越大,也就是身高与体重和鞋码具有一定的正相关,这就说明仅通过一个人的身高,就能大概猜测出这个人的体重和鞋码范围,这三个特征携带的信息量存在一定程度上的重叠,也就是信息冗余,而PCA可以很好地将其中相关的信息提炼出来,形成一组完全线性无关的特征向量,从而消除冗余。(这里的线性无关指的是统计学上的线性无关,也就是各特征之间没办法互相预测彼此,实际上在向量空间中原来的特征向量也是线性无关的,也就是说各向量间无法精确互相表示)
③揭示结构:
发现数据背后隐藏的、简单的驱动因素或基本结构。
揭示结构其实就是分析出这些成分的重要程度,然后给出主成分的从大到小排序,让我们评判时可以更注重重要程度大的成分,忽略重要程度较小的成分。
二.主成分分析举例
举个最简单例子来辅助理解:
1.原始数据(二维数据)
我们有两个特征,4个样本点:
-
A: (1, 1)
-
B: (2, 2)
-
C: (3, 1.5)
-
D: (4, 2.5)
数据矩阵:
其中第一列是特征,第二列是特征
。
2.中心化(Zero-Centering)
中心化,简单来说,就是将数据集中的每一个数据点都减去整个数据集的平均值。这个操作将数据的“中心”或“均值点”移动到了坐标原点(零点),从而确保PCA找到的主成分方向是数据真正的方差最大化方向,而不是被数据本身的偏移量所误导。
计算每个特征的均值:
-
特征1 (x1) 均值: (1+2+3+4)/4=2.5(1+2+3+4)/4=2.5
-
特征2 (x2) 均值: (1+2+1.5+2.5)/4=1.75(1+2+1.5+2.5)/4=1.75
将每个数据点减去均值:
-
A: (1-2.5, 1-1.75) = (-1.5, -0.75)
-
B: (2-2.5, 2-1.75) = (-0.5, 0.25)
-
C: (3-2.5, 1.5-1.75) = (0.5, -0.25)
-
D: (4-2.5, 2.5-1.75) = (1.5, 0.75)
中心化后的数据矩阵:
3. 计算协方差矩阵 (Covariance Matrix)
公式:
所以协方差矩阵:
4. 特征分解 (Eigen Decomposition)
解方程:
利用求根公式解得:
求特征向量:
对于:
方程:
单位向量:
这就是第一主成分(PC1),方向大致是。
对于:
方程:
单位向量:
这就是第二主成分(PC2),方向与PC1垂直,大致是。
5. 计算主成分得分 (Scores)
投影矩阵:
计算每个点的主成分得分(即向主成分坐标系投影):
主成分得分:
6. 结果解读与降维
-
方差:PC1的方差是
,PC2的方差是
。
-
方差解释率:PC1解释了
的总方差,PC2只解释了约
。
-
降维:如果我们降维到一维,会选择丢弃PC2。
-
一维表示:我们保留PC1得分
。这个新的一维数据几乎完全保留了原始数据的结构(因为PC1解释了
的方差),但我们丢失了在PC2方向上的微小差异(例如,我们无法再区分B点和C点,因为它们的PC1得分绝对值相同)。
PS:三个坐标系
这个例子中,用到了三个坐标系,分别是:
坐标系1:原始坐标系 (Original Coordinate System)
这是我们最开始的数据所在的坐标系。
-
坐标轴:
和
-
数据点坐标:
-
A: (1, 1)
-
B: (2, 2)
-
C: (3, 1.5)
-
D: (4, 2.5)
-
这个坐标系是任意给定的,代表了数据的原始测量值。
坐标系2:中心化坐标系 (Centered Coordinate System)
为了计算PCA,我们将原点移到了数据的中心(均值点)。
-
坐标轴:
和
。方向和原始坐标系一致,只是原点移动了。
-
新原点:(2.5, 1.75) - 这是原始数据的均值点。
-
数据点坐标:
-
A: (-1.5, -0.75)
-
B: (-0.5, 0.25)
-
C: (0.5, -0.25)
-
D: (1.5, 0.75)
-
几何关系:这个坐标系只是原始坐标系的一个平移。
坐标系3:主成分坐标系 (Principal Component Coordinate System)
这是PCA找到的新坐标系,是整个过程的输出。
-
坐标轴:
和
-
原点:与中心化坐标系的原点相同(即原始数据的均值点)。
-
坐标轴方向:
-
PC1轴方向:沿着向量
(在原始坐标系中的方向)
-
PC2轴方向:沿着向量
(在原始坐标系中的方向,且与PC1垂直)
-
-
数据点在这个新坐标系中的坐标就是我们计算出的主成分得分:
-
A: (-1.675, -0.093)
-
B: (-0.360, 0.429)
-
C: (0.360, -0.429)
-
D: (1.675, 0.093)
-
原始坐标: - 在原始特征空间中定位
中心化坐标: - 相对于数据中心的定位
主成分坐标/得分: - 在优化后的新空间中的定位
三.主成分分析代码中的使用
scikit-learn 在 sklearn.decomposition 模块中提供了 PCA 的实现,这里给出使用方式的代码(注意事项附带在注释之中):
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler# 1. 准备数据 (假设 X 是一个 n_samples x n_features 的矩阵,这里是4 x 2)
X = np.array([[1, 1],[2, 2],[3, 1.5],[4, 2.5]])
print("原始数据 X:\n", X)# 2. 数据预处理 (强烈建议标准化,尤其是特征量纲不同时)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print("标准化后的数据 X_scaled:\n", X_scaled)
# PS:这里的步骤并不属于PCA的范畴,PCA并不附带标准化的功能
# 但是PCA自带中心化的功能,不需要手动中心化处理# 3. 创建并拟合PCA模型
# 方法一:指定主成分保留个数
pca = PCA(n_components=2) # 保留所有成分,用于观察
# 方法二:指定保留的方差比例
# 保留95%方差的成分即取的主成分总共方差占比≥95%
# 少取一个都会让占比<95%
# pca = PCA(n_components=0.95) # 保留95%方差的成分# 可以理解为创造主成分的坐标系
pca.fit(X_scaled) # PCA模型从数据中学习主成分# 4. 转换数据 (计算主成分得分)
X_pca = pca.transform(X_scaled)
print("主成分得分 (X_pca):\n", X_pca)# 5. 查看模型信息
print("各主成分的方差 (解释方差):", pca.explained_variance_)
print("各主成分的方差占比 (解释方差比率):", pca.explained_variance_ratio_)
print("累计方差占比:", np.cumsum(pca.explained_variance_ratio_))
四.总结
核心认知要点:
-
“坐标系”与“坐标值”:PCA的本质是寻找一个为数据量身定制的新坐标系。主成分是构成这个新坐标系的坐标轴(基向量),而主成分得分则是原始数据点在这个新坐标系下的坐标值。这是理解PCA工作流的基础。
-
方差即信息:PCA的整个数学框架建立在“数据的方差越大,所蕴含的信息量就越多”这一基本假设之上。其寻优目标就是找到能使投影方差最大化的方向。
-
无损变换与有损降维:PCA的数学变换过程本身是无损且可逆的。信息损失并非来自变换方法,而是源于后续的降维决策——即主动舍弃方差较小(信息量较少)的后几位主成分。
-
中心化的重要性:中心化确保了所有特征在分析中被公平对待,防止PCA的结果被数值范围大的特征所主导。
典型工作流:
-
预处理:对数据进行标准化(StandardScaler),消除量纲影响。
-
建模:创建PCA模型并拟合(.fit()),从数据中学习主成分方向,构建新坐标系。
-
转换:将数据投影(.transform())到新坐标系,得到主成分得分。
-
决策:根据主成分的解释方差比率,决定保留前k个主成分,实现降维。
