跳转至

PCA 降维详解

PCA (Principal Component Analysis,主成分分析) 是一种常用的数据降维方法,通过线性变换将高维数据映射到低维空间,同时保留数据的主要特征。

1. 基本思想

PCA 降维的核心思想是: - 将 N 维空间映射到 k 维空间(k < N) - 这 k 个维度是正交的,称为主成分 - 主成分是原始特征的线性组合 - 主成分能最大化保留原始数据的方差信息

2. 数学原理

2.1 数据表示

对于 n 个 m 维度的数据,记为矩阵 X n athbb{R}^{n imes m} ,其中: - n 是样本数量 - m 是特征维度

2.2 目标

找到 k 个投影向量 v_1, v_2, dots, v_k n athbb{R}^m ,使得: - 投影后的新特征 Xv_i 具有最大的方差 - 各个投影向量之间正交

3. 计算步骤

3.1 数据预处理

  1. 中心化:将每个特征的均值变为 0

\(\(X_{centered} = X - u\)\)

其中 u 是每个特征的均值向量

3.2 计算协方差矩阵

协方差矩阵 igma n athbb{R}^{m imes m} 的计算公式:

\[igma = \frac{1}{n-1} X_{centered}^T X_{centered}\]

协方差矩阵的性质: - igma[i, j] 表示第 i 个特征与第 j 个特征的协方差 - igma[i, i] 表示第 i 个特征的方差 - 协方差矩阵是对称矩阵

3.3 计算特征值和特征向量

求解协方差矩阵的特征值问题:

\[igma v = ambda v\]

其中: - ambda 是特征值 - v 是对应的特征向量

3.4 选择主成分

  1. 将特征值按从大到小排序
  2. 选择前 k 个最大的特征值对应的特征向量
  3. 这些特征向量就是主成分

3.5 数据投影

将中心化后的数据投影到主成分上:

\[Y = X_{centered} V\]

其中 V n athbb{R}^{m imes k} 是由前 k 个主成分组成的矩阵

4. 示例计算

4.1 示例数据

假设我们有以下协方差矩阵:

\[igma = \begin{bmatrix} 2.0 & 0.8 \\ 0.8 & 0.6 \end{bmatrix}\]

4.2 计算特征值

求解特征方程 |igma - ambda I| = 0 :

\[ \begin{vmatrix} 2.0 - ambda & 0.8 \\ 0.8 & 0.6 - ambda \end{vmatrix} = 0 \]

展开计算:

\[(2.0 - ambda)(0.6 - ambda) - 0.8^2 = 0$$ $$ambda^2 - 2.6ambda + 0.56 = 0\]

解得: \(\(ambda_1 = 2.3630, uad ambda_2 = 0.2370\)\)

4.3 计算特征向量

对于 ambda_1 = 2.3630 ,求解方程 (igma - ambda_1 I)v = 0 :

\[ \begin{bmatrix} -0.363 & 0.8 \\ 0.8 & -1.763 \end{bmatrix} \begin{bmatrix} v_1 \\ v_2 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} \]

解得单位特征向量: \(\(v_1 = \begin{bmatrix} 0.9106 \\ 0.4132 \end{bmatrix}\)\)

对于 ambda_2 = 0.2370 ,同理解得: \(\(v_2 = \begin{bmatrix} -0.4132 \\ 0.9106 \end{bmatrix}\)\)

4.4 投影

如果我们选择 k=1,只保留第一个主成分,那么数据将被投影到 v_1 方向上。

5. 代码实现

5.1 使用 NumPy 实现 PCA

import numpy as np

def pca(X, k):
    """
    PCA 降维实现

    参数:
        X: 输入数据,形状为 (n_samples, n_features)
        k: 降维后的维度

    返回:
        Y: 降维后的数据,形状为 (n_samples, k)
        V: 主成分矩阵,形状为 (n_features, k)
        explained_variance: 解释方差
    """
    # 中心化
    mean = np.mean(X, axis=0)
    X_centered = X - mean

    # 计算协方差矩阵
    cov_matrix = np.cov(X_centered, rowvar=False)

    # 计算特征值和特征向量
    eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)

    # 按特征值从大到小排序
    idx = np.argsort(eigenvalues)[::-1]
    eigenvalues = eigenvalues[idx]
    eigenvectors = eigenvectors[:, idx]

    # 选择前 k 个主成分
    V = eigenvectors[:, :k]

    # 计算解释方差
    explained_variance = eigenvalues[:k] / np.sum(eigenvalues)

    # 投影
    Y = X_centered @ V

    return Y, V, explained_variance

# 示例
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
Y, V, explained_variance = pca(X, 1)
print("降维后的数据:", Y)
print("主成分:", V)
print("解释方差:", explained_variance)

5.2 使用 scikit-learn 实现 PCA

from sklearn.decomposition import PCA
import numpy as np

# 示例数据
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])

# 创建 PCA 实例
pca = PCA(n_components=1)

# 拟合并转换数据
Y = pca.fit_transform(X)

print("降维后的数据:", Y)
print("主成分:", pca.components_)
print("解释方差:", pca.explained_variance_ratio_)

6. 应用场景

PCA 在以下场景中特别有用:

  1. 数据可视化:将高维数据降维到 2D 或 3D 以便可视化
  2. 特征提取:提取最有代表性的特征,减少特征维度
  3. 噪声过滤:通过保留主要成分,过滤掉噪声
  4. 模型训练加速:减少特征维度,加速模型训练
  5. 数据压缩:减少数据存储和传输成本

7. 注意事项

  1. 数据标准化:PCA 对数据尺度敏感,通常需要先进行标准化
  2. 解释方差:通过解释方差比例选择合适的 k 值
  3. 计算复杂度:对于大规模数据,需要考虑计算效率
  4. 非线性数据:对于非线性数据,PCA 可能不是最佳选择,可考虑 t-SNE、UMAP 等方法

8. 总结

PCA 是一种强大的数据降维方法,通过线性变换将高维数据映射到低维空间,同时保留数据的主要特征。其核心步骤包括:

  1. 数据中心化
  2. 计算协方差矩阵
  3. 计算特征值和特征向量
  4. 选择主成分
  5. 数据投影

PCA 在数据可视化、特征提取、噪声过滤等方面有广泛应用,是机器学习和数据分析中的重要工具。