通俗易懂主成分分析(PCA)

7 阅读17分钟

What:主成分分析法到底是什么?

说到底,主成分分析法只是一种技术的某种实现形式,而这门技术叫做降维。 所以,在了解主成分分析法(PCA)之前,你需要先了解什么是降维。

降维:是数据分析和机器学习中的一项重要技术,是将高维数据转换为较低维度表示的过程,旨在简化数据结构、减少计算复杂性、去除冗余信息,并便于后续的分析、可视化和建模。

Why:我们为什么要用主成分分析法

高维数据会给我们带来什么挑战?

维度爆炸

试想一下,当你的一个数据集里有超级多的维度,更通俗的说,某一个主体有超级多的属性。

举个栗子:

想象你身处一家馆藏浩如烟海的图书馆中,这家图书馆包含了几乎世间所有学科的藏书,你求知若渴,什么都想看看,但当你看到无数个高大的矗立在你面前的书架时,你踟蹰了。

emmm...大概就像这样

image.png

这只是你眼前的一隅,这分类也太多了吧!

在这里,我们把每一个书籍的分类都可以具象地认为是一个书架,每一个书架我们都可以想象成是图书馆这个主体的维度,那么每增加一个书架,就相当于增加了一个维度。

如果我想去寻找想看的书籍的时候,因为书架众多,占据的空间也很大,那么我去找书的路程就增加了。

如果想象一种极端的情况,这个图书馆里藏着这世界上所有的书籍分类,也就是有无数个书架,这时候你再去找一本想看的书,很有可能...你会迷路。

这种维度爆炸的问题,只是高维数据给我们带来的麻烦之一。

数据荒漠

再举个栗子:

你又去了那个图书馆,今天,有了上次不知道看啥的经验教训,你这次带了书单来,书单上的书籍是:《统计学概论》《数据库系统概论》《python从入门到放弃》《母猪的护理手册》《乌克兰拖拉机简史》......

进入图书馆,你想找数学类别的书架,计算机书架、养殖书架、文学书架。

而不巧的是,这几个类别的书架相距甚远。

此时,在图书馆这个空间里,除了你想去的这几个书架之外,其他书架对于你来说没有用处,大部分书架对你而言是空荡荡的。

这种现象在数据科学中被称为“数据稀疏性”,它导致模型难以从有限的样本中学习到普遍规律,就像探险家在广袤的沙漠中寻找水源,难度大大增加。

冗余馆藏(多重共线性)

图书馆中可能会出现多本内容高度相似的书籍,它们占据了宝贵的存储空间,却并没有提供额外的价值。

在高维数据中,存在大量冗余或高度相关的特征(多重共线性),它们传递的是几乎相同的信息,增加了分析的复杂性,却没有实质性地增加对数据的理解

就如同图书馆馆长在清理库存时,发现很多复制品和翻译版,徒增管理负担。

资源消耗的黑洞

维护一个庞大的图书馆需要巨大的人力、物力和财力。

同样,处理高维数据需要更多的计算资源(内存、CPU、GPU)和更长的时间。

在大规模数据分析和机器学习项目中,这可能导致硬件成本飙升,运行效率低下,就像图书馆的运营成本不断吞噬预算,影响其服务质量。

为了方便理解,这里再举个例子:

假设你在研究一款手机应用的用户行为数据,包含了用户的年龄、性别、地理位置、使用时段、点击频率、停留时长、购买记录等多个维度。随着维度增多,数据集变得越来越庞大且复杂,模型训练可能陷入以下困境:

维度灾难:模型需要在海量的特征组合中寻找最优解,计算量剧增,训练时间延长。

数据稀疏:用户的行为模式可能只集中在一小部分特征组合上,大量特征组合几乎没有观测值,模型难以从有限的样本中学习到可靠规律。

冗余特征:“点击频率”和“停留时长”可能高度相关,两者提供的信息有很大程度的重叠,增加了模型理解和优化的难度。

过拟合风险:在大量噪声特征和有限样本下,模型可能过度学习某些特定用户的行为模式,导致在新用户上预测效果不佳。

资源消耗:处理如此高维的数据集,对计算资源的需求显著增加,可能超出现有硬件的承载能力,影响项目的实施进度和成本效益。

基于以上种种原因,我们需要在处理高维数据的时候,进行降维。

降维有多种方式,比如本文介绍的主成分分析(PCA),还有线性判别分析(LDA)、独立成分分析(ICA)、多维缩放(MDS)、等距映射(Isomap)等等。

在了解了降维的概念和基本理念之后,我们再对PCA下个定义:

PCA通过线性变换将原始数据投影到一个新的坐标系中,新坐标系的轴(主成分)是按方差大小排序的,确保前几个主成分能最大程度地保留数据的总体方差。通过选择保留最重要的几个主成分,可以实现数据的降维。PCA尤其适用于去除线性相关性较高的特征以及对数据进行可视化。

Who、Where:谁该应用?在什么领域用?

在现实中,PCA在各个领域具有广泛应用,具体如下:

金融数据分析:

  1. 投资组合优化:在股票、债券等金融市场数据中,通过PCA识别出影响市场波动的主要因子(如宏观经济指标、行业趋势、市场情绪等),有助于构建风险分散的投资组合。
  2. 信用评分模型:在个人或企业的信用评估数据中,PCA可提取关键信用特征,降低模型复杂度,提高信用评分系统的稳定性和预测准确性。

生物医学研究:

  1. 基因表达数据分析:在大规模基因表达谱数据中,PCA用于识别驱动细胞类型差异或疾病状态的关键基因模块,简化高维基因数据,辅助疾病分类和分子机制研究。
  2. 医学影像处理:在MRI、CT等医学影像数据中,PCA用于压缩图像数据,去除噪声,提取主要的解剖结构信息,有助于疾病的诊断和监测。

遥感与地理信息系统(GIS):

  1. 地球观测数据分析:利用PCA对卫星遥感数据(如Sentinel-2、Landsat等)进行降维,提取植被生长状况、土地覆盖变化等环境变量的主要成分,用于农业监测、气候变化研究等。
  2. 城市规划与环境监测:分析城市空气质量、交通流量、人口密度等多源数据,PCA能揭示城市空间结构、环境污染分布等关键模式,支持决策制定。

市场营销与消费者行为分析:

  1. 客户细分:在消费者购买历史、偏好调查、社交媒体行为等大数据中,PCA用于识别消费群体的主要特征,实现客户细分,指导精准营销策略。
  2. 产品推荐系统:通过对用户评价、浏览记录、购买历史等数据进行PCA,提炼关键的产品特征和用户偏好维度,用于个性化推荐算法的设计。

图像与视频处理:

  1. 人脸识别:在人脸图像数据中,PCA用于提取面部特征向量,降低数据维度,提高人脸识别算法的速度和准确性。
  2. 图像压缩:对图像数据进行PCA,保留主要的视觉信息,去除冗余部分,实现高效的图像数据压缩与传输。

社交网络分析:

  1. 社区检测:在社交网络节点属性数据(如用户兴趣、互动行为等)上应用PCA,识别主导社区结构形成的属性维度,辅助社区发现和网络演化分析。
  2. 舆情分析:对大规模文本数据(如微博、论坛帖子)进行PCA,提取反映公众情绪、话题焦点的主成分,快速掌握舆情动态。

工业制造与质量管理:

  1. 设备故障诊断:在设备运行监测数据中,PCA可用于识别故障模式的主要特征,实现早期故障预警和诊断。
  2. 产品质量控制:通过对生产过程中的多元质量指标进行PCA,找出影响产品质量的核心因素,指导工艺参数优化和质量改进。

When:什么时候用?

选择主成分分析(PCA)作为数据分析方法时,通常考虑以下几种情况:

线性相关性较强的高维数:

当数据集中的特征之间存在显著的线性相关性时,PCA能够有效地捕捉这种相关性并将其转化为少数几个不相关的主成分。这些主成分是原始特征的线性组合,能够以较低的维度保留大部分数据变异信息

样本量相对较小但特征数众多的数据集:

在“样本数远小于特征数”的情况下,即所谓的“小样本大维度”问题,PCA有助于克服过拟合风险。通过降维,PCA可以减少模型复杂度,避免模型在训练过程中过度拟合噪声和个别样本的特性,提高模型的泛化能力。

需要数据可视化:

对于高维数据,直接在二维或三维空间中进行可视化通常是不可能的。通过PCA将高维数据降至两维或三维,可以生成散点图、热力图等,直观展示数据分布、集群结构和潜在关系,有助于研究人员洞察数据的内在模式。

探索数据内部结构:

当需要了解数据集的主要变异方向、识别支配数据变化的主要因素时,PCA可以帮助揭示数据的主成分(即最大方差方向),这些主成分往往对应着数据最重要的特征组合或潜在变量。这对于数据预处理、特征选择、假设检验等有重要价值。

连续型数值特征为主的高维数据:

PCA适用于处理由连续型数值特征构成的高维数据,这些数据易于进行线性变换和方差分析。对于离散型、类别型或混合型特征占主导的数据集,可能需要先进行适当的预处理(如独热编码、二值化等)或考虑其他类型的降维方法。

存在噪声和无关变量的高维数据:

如果数据集中包含大量噪声变量或与分析目标关系较弱的无关变量,PCA通过降维可以过滤掉这些不重要信息,聚焦于数据的主要结构和趋势。这有助于提高后续分析或建模的精度和稳定性。

无标签数据的降维:

PCA是一种无监督学习方法,不需要事先知道数据的类别标签。对于没有明确分类信息的数据集,若需要进行降维以进行后续的聚类分析、异常检测或其他无监督学习任务,PCA是一个合适的选择。

数据压缩与传输:

在数据存储或传输受限的情况下,PCA可以作为一种有效的数据压缩手段。通过保留主要成分,丢弃次要成分,可以在不影响关键信息的前提下大幅度减小数据体积。

How:怎么用?如何实现?

主成分分析(PCA)的具体步骤以及实现通常包括以下七个环节:

步骤1:数据预处理

标准化/归一化:对原始数据进行标准化或归一化处理,确保所有特征具有相同尺度,消除特征间数值范围差异对PCA结果的影响。

常用方法包括z-score标准化(均值为0,标准差为1)和最大最小值归一化(值域为[0, 1]或[-1, 1])。

步骤2:计算协方差矩阵

中心化:将标准化后的数据进一步减去其列(特征)均值,得到零均值数据,确保数据在各个特征上的均值为0。

计算协方差矩阵:

对中心化后的数据矩阵X计算协方差矩阵Σ,公式为:

Σ=1n1XTX \Sigma = \frac{1}{n-1} X^T X

其中,n是样本数,X是中心化后的数据矩阵。

步骤3:求解协方差矩阵的特征值与特征向量

特征值分解:对协方差矩阵Σ进行特征值分解,得到一组特征值λ_i及其对应的特征向量v_i。

数学表达式为: Σvi=λivi\Sigma v_i = λ_i v_i 可以使用数值计算库(如NumPy、SciPy等)提供的eig()函数来完成这一计算。

步骤4:排序特征值与特征向量

按特征值大小排序:将特征值从大到小排序,并按照相同的顺序排列对应的特征向量。较大的特征值对应的特征向量反映了数据中更重要的主成分。

步骤5:选择主成分

确定保留的主成分数量:根据实际需求或通过解释累积贡献率(如累计方差百分比)来决定保留多少个主成分。

通常选择累积贡献率达到一定阈值(如80%、90%)所需的最少主成分数量。

选取对应特征向量:选择排序后的前k个特征向量,这些向量构成了降维后的新坐标系。

步骤6:数据投影

数据转换:将原始数据矩阵X沿选定的前k个特征向量进行投影,得到降维后的数据矩阵Y: [ Y = X W_k ] 其中,W_k是前k个特征向量构成的矩阵(按列排列)。

步骤7:结果解释与应用

解释主成分:分析主成分的载荷(特征向量的元素有时也被称为载荷(loadings)),理解各主成分对应的主要特征组合及其对数据变异的贡献。

数据可视化:

将降维后的数据在二维或三维空间中绘制,以便直观地观察数据分布、集群结构和潜在关系。 后续分析或建模:使用降维后的数据进行聚类、分类、回归等后续分析或构建机器学习模型。

python代码实现如下,数据集为numpy随机生成用户行为数据集:

# 导入所需库:numpy用于数值计算,sklearn.decomposition.PCA用于主成分分析,matplotlib.pyplot用于数据可视化
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt


# 设置随机数生成器种子,确保每次运行代码时生成的数据保持一致(可选,用于演示目的)
np.random.seed(42)

# 定义数据集的规模:1000个样本,每个样本包含10个特征
n_samples = 1000
n_features = 10

# 使用numpy的random.normal函数生成高斯分布的随机数据。生成的data是一个1000行(样本)×10列(特征)的二维数组
data = np.random.normal(size=(n_samples, n_features))

# 创建PCA对象,指定保留的主成分数量为2
pca = PCA(n_components=2)

# 调用fit_transform方法,对数据集data进行PCA降维。返回的结果transformed_data是一个1000行×2列的数组,表示降维后的数据
transformed_data = pca.fit_transform(data)

# 获取PCA对象的explained_variance_ratio_属性,这是一个列表,表示每个主成分解释的方差比例。此处取前2个比例
explained_variance_ratio = pca.explained_variance_ratio_

# 打印前2个主成分的方差占比
print(f"Explained variance ratio of the first 2 components: {explained_variance_ratio[:2]}")


# 创建一个新的绘图窗口,设定其大小为宽8英寸、高6英寸
plt.figure(figsize=(8, 6))

# 绘制散点图,横坐标为transformed_data的第一列(即第一个主成分),纵坐标为第二列(第二个主成分)
# alpha参数设置点的透明度,值为0.5表示半透明
plt.scatter(transformed_data[:, 0], transformed_data[:, 1], alpha=0.5)

# 设置图表标题
plt.title("PCA Reduced Data Visualization")

# 设置x轴标签,表示第一个主成分(Principal Component 1)
plt.xlabel("PC1")

# 设置y轴标签,表示第二个主成分(Principal Component 2)
plt.ylabel("PC2")

# 添加网格线,便于观察数据分布
plt.grid(True)

# 显示绘制好的图表
plt.show()

结果如下:

image.png

image.png

x轴标签:“PC1”:代表第一个主成分(Principal Component 1),它是原数据集众多特征通过线性组合后形成的新特征,能最大程度地保留原数据集的方差,即数据变异信息。

y轴标签:“PC2”:代表第二个主成分,它是除第一个主成分之外,能最大程度保留剩余方差的新特征。与PC1一起,它们构成了降维后数据的二维坐标系。

散点图中的每个点代表一个样本(用户),其位置由降维后数据的两个坐标值(PC1和PC2)确定。

点的分布形态、聚集程度、是否有明显边界或趋势等,反映了降维后数据在二维空间中的分布特点。例如:

  1. 若点分布均匀,如果生成的散点图中样本点分布较为均匀,没有明显的聚集或离散区域,这可能意味着在选定的两个主成分(PC1和PC2)上,样本的行为特征差异不大,或者数据的内在结构不够清晰。在这种情况下,PCA降维可能并未揭示出显著的模式或聚类结构。
  2. 若点呈现出明显的聚类现象,如果样本点在图中形成了若干个明显的聚类(簇),即某些点较为密集地聚集在一起,而不同聚类之间相隔较远,这通常表明数据在PC1和PC2上存在显著的分群现象。每个聚类可能代表一类具有相似行为特征的用户群体,PCA降维成功地捕捉到了数据中的隐藏结构
  3. 若点沿某一方向呈线性或曲线趋势,如果样本点沿着某一方向(如从左下到右上、从左上到右下等)呈现线性或近似线性的分布,或者沿某种曲线(如椭圆、抛物线等)分布,这可能暗示PC1和PC2与某个潜在的连续变量(如用户活跃度、消费水平等)存在关联。沿着趋势的方向,样本的行为特征可能存在渐变或周期性变化。
  4. 多模式分布: 如果样本点同时表现出多种分布趋势,如既有聚类又有趋势,或者存在多个相互分离的聚类,这说明数据在PC1和PC2上具有复杂的结构。每个模式或聚类可能对应一种特定的用户行为类型或阶段。