主成分分析(PCA)算法
主成分分析(Principal Component Analysis, PCA)是一种常用的无监督降维算法,主要用于数据的特征提取和维度压缩。其目标是将高维数据映射到低维空间,同时尽可能保留数据的主要信息。
PCA的主要思想
- 寻找新的坐标轴(主成分),使数据在这些轴上的方差最大。
- 这些新坐标轴是数据的线性组合,并且彼此正交(无相关性)。
- 降维通过选择前 k 个方差最大的主成分实现。
PCA的数学原理
1. 数据标准化
为避免特征量纲(单位)对结果的影响,需要对原始数据进行标准化处理:
其中:
- 是原始数据的第 i 个样本在第 j 个特征上的值;
- 是第 j 个特征的均值;
- 是第 j 个特征的标准差。
2. 协方差矩阵
计算标准化数据的协方差矩阵 Σ :
其中:
- X 是标准化后的数据矩阵;
- 协方差矩阵 Σ 的每个元素 表示特征 i 和特征 j 的协方差。
3. 特征分解
对协方差矩阵 Σ 进行特征值分解:
其中:
- λ 是特征值,表示数据在对应特征向量方向上的方差;
- v 是特征向量,表示主成分的方向。
按照特征值从大到小排序,选取前 k 个特征向量对应的主成分,构造变换矩阵 W 。
4. 数据降维
将原始数据 X映射到低维空间:
其中:
- Z 是降维后的数据;
- W 是由前 k 个特征向量组成的矩阵。
PCA算法步骤
- 输入:原始数据矩阵 X(m×n ,其中 m 是样本数,n 是特征数)。
- 数据标准化:对 X 的每个特征进行标准化。
- 计算协方差矩阵:计算标准化数据的协方差矩阵 Σ 。
- 特征值分解:对协方差矩阵进行特征值分解,获得特征值和特征向量。
- 选择主成分:按特征值从大到小排序,选择前 k 个主成分。
- 降维:将原始数据映射到主成分构成的低维空间。
PCA算法的Python实现
以下是PCA算法的实现代码:
python">import numpy as npdef pca(X, num_components):"""主成分分析(PCA)算法实现参数:X: 原始数据矩阵 (m, n),m为样本数,n为特征数num_components: 要保留的主成分数返回:Z: 降维后的数据矩阵 (m, num_components)W: 主成分矩阵 (n, num_components)"""# 1. 数据标准化X_mean = np.mean(X, axis=0) # 均值X_std = np.std(X, axis=0) # 标准差X_normalized = (X - X_mean) / X_std# 2. 计算协方差矩阵covariance_matrix = np.cov(X_normalized, rowvar=False)# 3. 特征值分解eigenvalues, eigenvectors = np.linalg.eigh(covariance_matrix)# 4. 按特征值从大到小排序sorted_indices = np.argsort(eigenvalues)[::-1]top_indices = sorted_indices[:num_components]top_eigenvectors = eigenvectors[:, top_indices]# 5. 数据降维Z = np.dot(X_normalized, top_eigenvectors)return Z, top_eigenvectors# 测试
if __name__ == "__main__":# 示例数据:4个样本,3个特征X = np.array([[2.5, 2.4, 3.5],[0.5, 0.7, 1.2],[2.2, 2.9, 3.1],[1.9, 2.2, 2.7]])num_components = 2Z, W = pca(X, num_components)print("降维后的数据:\n", Z)print("主成分矩阵:\n", W)
PCA的优点
- 减少数据维度,降低计算复杂度;
- 去除冗余特征,增强模型的泛化能力;
- 有效消除特征之间的相关性。
PCA的局限性
- PCA只考虑方差最大化,可能丢失对分类有意义的特征;
- PCA假设特征与均值的线性关系,不适用于非线性数据;
- 对数据的标准化敏感。