主成分分析(Principal Component Analysis, PCA)
主成分分析(PCA)是一种常用的降维技术,用于将高维数据投影到低维空间,同时尽可能保留原数据的主要信息(方差)。
1. PCA 的核心思想
- 目标:找到新的坐标轴(主成分),使得数据投影到这些轴上的方差最大化。
- 主成分:数据的主要变化方向。第一个主成分捕获最多的方差,第二个主成分与第一个正交,捕获剩余的最大方差,依此类推。
- 降维:选取前 k 个主成分,舍弃次要主成分,达到数据压缩的目的。
2. PCA 的步骤
步骤 1:标准化数据
- 数据集的不同特征可能具有不同的量纲和尺度,标准化将每个特征的均值设为 0,标准差设为 1:
其中, 是特征 j 的均值, 是特征 j 的标准差。
步骤 2:计算协方差矩阵
- 协方差矩阵表示各特征之间的线性关系:
其中, 是标准化后的数据矩阵。
步骤 3:计算特征值和特征向量
- 解出协方差矩阵的特征值 和对应的特征向量 ,特征向量表示主成分的方向,特征值表示对应的方差大小。
步骤 4:选择主成分
- 按特征值从大到小排序,选择前 k 个最大的特征值对应的特征向量。
步骤 5:投影数据到主成分空间
- 将原数据投影到选择的主成分方向:
其中, 是由前 k 个特征向量构成的矩阵。
3. 数学推导
最大化方差
- 假设投影方向为单位向量 ,投影后的数据方差为:
- 通过拉格朗日乘数法,约束 ,得优化问题:
解得 为协方差矩阵 的特征向量,最大方差为对应的特征值。
4. 特点
优点
- 降维:减少数据维度,降低计算复杂度。
- 特征解耦:发现数据中的主要变化方向。
- 去噪:通过忽略小的主成分去除噪声。
缺点
- 线性假设:PCA 假设数据是线性可分的,不适用于非线性数据。
- 信息损失:降维可能会丢失重要信息。
- 解释性差:主成分是线性组合,可能难以直观解释其物理意义。
5. PCA 的应用场景
- 数据可视化 :
- 将高维数据投影到二维或三维空间,便于可视化。
- 降维加速 :
- 在机器学习任务中减少特征数量,提高模型训练速度。
- 去噪 :
- 提取主要特征,过滤掉噪声。
- 图像压缩 :
- 在图像处理中减少数据存储需求。
6. 实现 PCA
手动实现 PCA
python
import numpy as np
# 数据
X = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0], [2.3, 2.7], [2, 1.6], [1, 1.1], [1.5, 1.6], [1.1, 0.9]])
# 步骤 1: 标准化数据
X_mean = np.mean(X, axis=0)
X_std = X - X_mean
# 步骤 2: 计算协方差矩阵
cov_matrix = np.cov(X_std.T)
# 步骤 3: 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
# 步骤 4: 选择主成分
idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]
# 步骤 5: 投影数据
k = 1 # 选择一个主成分
principal_components = eigenvectors[:, :k]
X_pca = X_std.dot(principal_components)
print("降维后的数据:\n", X_pca)
输出结果
Matlab
降维后的数据:
[[-0.82797019]
[ 1.77758033]
[-0.99219749]
[-0.27421042]
[-1.67580142]
[-0.9129491 ]
[ 0.09910944]
[ 1.14457216]
[ 0.43804614]
[ 1.22382056]]
使用 scikit-learn
实现
python
from sklearn.decomposition import PCA
import numpy as np
# 数据
X = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0], [2.3, 2.7], [2, 1.6], [1, 1.1], [1.5, 1.6], [1.1, 0.9]])
# PCA 降维
pca = PCA(n_components=1)
X_pca = pca.fit_transform(X)
print("降维后的数据:\n", X_pca)
输出结果
python
降维后的数据:
[[-0.82797019]
[ 1.77758033]
[-0.99219749]
[-0.27421042]
[-1.67580142]
[-0.9129491 ]
[ 0.09910944]
[ 1.14457216]
[ 0.43804614]
[ 1.22382056]]
7. 主成分数选择
- 累计解释方差比
- 累计解释方差比达到一定阈值(如 95%)时停止:
- 碎石图(Scree Plot)
- 观察特征值的变化,选择拐点作为主成分数。
8. PCA 的扩展
- Kernel PCA:将数据映射到高维空间,处理非线性数据。
- Sparse PCA:增加稀疏性约束,选择更少的特征。
- Incremental PCA:适合大规模数据集,分批处理数据。
PCA 是降维领域的重要工具,尽管其本质是线性投影,但通过合理使用可以显著提升数据处理效率和模型性能。