一、主成分分析概述
PCA(Principal Component Analysis,主成分分析)是一种常用的降维算法,它通过投影的方式将高维数据映射到低维的空间中,并且保证在所投影的维度上,原数据的信息量最大,从而使用较少的数据维度,保留住较多的原始数据特性。
图1 数据点投影到低维超平面
二、PCA可以基于两种思路进行优化
最近重构性:样本点在这个低位超平面的距离最近
最大可分性 :样本点在低维超平面上的投影尽可能分开
基于最近重构性和最大可分性,能够分别得到主成分分析的两种等价推导:
先从最近重构性来推导,假定数据样本已经进行了中心化处理。进一步地,我们通过投影变换得到了一个新的坐标系,该坐标系由一组标准正交基向量 {𝑤1,𝑤2,…,𝑤𝑑}组成。在这个新坐标系中,每个向量 𝑤𝑖都是单位向量,即,并且对于 𝑖≠𝑗,向量wi 和 wj 之间是正交的,即 =0。
如果我们选择丢弃新坐标系中的部分坐标,即将数据的维度从 𝑑 降低到 𝑑′<𝑑,那么每个样本点在低维坐标系中的投影可以表示为 ,其中 是样本点 𝑥𝑖 在低维坐标系下第 𝑗 维的坐标。
若基于降维后的坐标 𝑧𝑖来重构原始样本点 ,我们会得到一个重构的样本点 ,其计算公式为:
原样本点 与基于投影重构的样本点之间的距离为
其中 ,根据最近重构性,以上的式子应被最小化,考虑到是标准正交基,是协方差矩阵,有
(1.1)
这就是主成分分析的优化目标 。
从最大可分性出发,能得到主成分分析的另一种解释。样本点在新空间中超平面上的投影是 ,若所有样本点的投影能尽可能分开,则应该使投影后样本点的方差最大化,如图 2 所示
投影后样本点的协方差矩阵是 于是优化目标可写为
(1.2)
图2 使所有样本的投影尽可能分开(如图中红线所示)需最大化投影点的方差
因为式子(1.1)与式子(1.2)等价,对其中一个式子使用拉格朗日乘子法可得
因此,只需对协方差矩阵进行特征值分解,将求得的特征值排序:,再取前d'个特征值对应的特征向量构成,这就是主成分分析的解。
三、PCA算法的步骤
假设有n个样本,m个指标,则可以构成大小为n*m的样本矩阵X:
1. 数据中心化处理:对原始数据进行标准化处理,使得每个特征的均值为0,方差为1。
其中为原始X矩阵平均值,为原始X矩阵标准差,为标准化处理后元素
以下为数据中心化后的坐标系:
2. 计算协方差矩阵:根据标准化后的数据计算协方差矩阵,用来衡量不同特征之间的关联性。
3. 特征值分解:对协方差矩阵进行特征值分解
将求解的特征值排序:
特征向量:
4. 选择主成分:根据特征值的大小选择最大的前k个特征向量作为主成分。
贡献率:
累计贡献率:
选择 𝑘 的标准是使得累计贡献率达到一个可接受的阈值
5. 数据投影:将原始数据投影到选取的主成分上,得到降维后的数据。
代码运行结果
四、代码实现
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
np.random.seed(0) # 设置随机种子以获得可复现的结果
X = np.empty((100, 2))
X[:, 0] = np.random.uniform(-10, 10, size=100)
X[:, 1] = 0.6 * X[:, 0] + np.random.normal(0, 3, size=100)
# 数据中心化处理
mean_X = X.mean(axis=0)
X_centered = X - mean_X
# 计算协方差矩阵
cov_matrix = np.cov(X_centered, rowvar=False)
# 特征值分解
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)
# 选择主成分
# 选择最大的特征值对应的特征向量作为最好的主成分方向
max_eigenvalue_index = np.argmax(eigenvalues)
principal_component = eigenvectors[:, max_eigenvalue_index]
# 数据投影到主成分空间
X_reduced = X_centered.dot(principal_component.reshape(-1, 1))
# 绘制中心点数据
plt.scatter(X_centered[:, 0], X_centered[:, 1], color='black', label='Centered Data')
# 绘制最好的主成分方向
pc_scale = 10 # 控制主成分方向线的长度
plt.arrow(mean_X[0], mean_X[1], pc_scale * principal_component[0], pc_scale * principal_component[1],
color='red', head_width=0.1, head_length=0.1)
plt.text(0, 0, "PCA", color='red', fontsize=12)
plt.title('PCA - Principal Component Analysis')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.grid(True)
plt.show()
主成分方向为图中红色直线:
五、PCA的优缺点
优点:
-
数据简化:PCA能够显著降低数据的维度,同时尽量保留数据中的变异性。这对于处理高维数据集特别有用,可以减少计算复杂度,加快后续数据分析或机器学习模型的训练速度。
-
去除噪声:在进行PCA时,与数据方差较小的方向相关的噪声可能会被过滤掉,因为这些方向上的特征往往被赋予较低的权重。
-
特征提取:通过识别数据的主要成分,PCA可以帮助发现数据集中的关键结构和模式,提供对数据更深入的理解。
-
可视化:对于高维数据,降维至2D或3D后,可以使用图形方式展示,便于人类直观理解数据分布。
-
优化存储和计算资源:降维减少了存储数据所需的内存空间,同时降低了计算资源的需求。
缺点:
-
丢失信息:尽管努力保持数据的变异性,PCA仍可能丢弃对某些任务重要的低方差特征。这意味着,尽管降维,可能损失一些分类或预测能力。
-
线性假设:PCA基于线性变换,因此可能无法捕获非线性的数据关系。对于非线性数据分布,可能需要使用如Kernel PCA或其他非线性降维方法。
-
依赖于尺度:PCA对数据的尺度非常敏感,要求输入数据通常是经过标准化处理的。未标准化的数据可能导致不正确的结果。
-
解释性问题:降维后的主成分往往是原始特征的线性组合,这可能使得新特征难以解释,尤其是在需要领域知识解释的场景下。
-
最优成分数量选择:确定要保留的主成分数目k可能具有一定的主观性,通常需要通过经验或交叉验证等方法来决定。