跳至主要內容

PCA:主成分分析

Alex Sun2023年2月27日AI线性代数AI线性代数PCA小于 1 分钟

主成分分析简单步骤。

1. PCA 介绍

SVD:奇异值分解 中,我们介绍了特征值分解和奇异值分解的基本方法,本节我们将使用这两种方法进行 主成分分析(Principal Component Analysis,PCA)。

2. 使用特征值分解进行 PCA

设有 mmnn 维数据,需要降维到 kk 维(k<nk < n),使用特征值进行 PCA 的基本步骤如下:

  1. 将原始数据按列组成 nnmm 列矩阵 X\boldsymbol{X}
  2. X\boldsymbol{X} 的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
  3. 求出协方差矩阵 C=1mXXT\boldsymbol{C} = \dfrac{1}{m}\boldsymbol{X}\boldsymbol{X}^{\mathsf{T}}
  4. 求出协方差矩阵 C\boldsymbol{C} 的特征值及对应的特征向量
  5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 kk 行组成矩阵 P\boldsymbol{P}
  6. Y=PX\boldsymbol{Y} = \boldsymbol{P}\boldsymbol{X} 即为降维到 kk 维后的数据

3. 使用奇异值分解进行 PCA

import numpy as np


def pca(X: np.ndarray, k: int):  # k is the components you want
    # mean of each feature
    n_samples, n_features = X.shape
    mean = np.array([np.mean(X[:, i]) for i in range(n_features)])
    # normalization
    norm_X = X-mean
    # scatter matrix
    scatter_matrix = np.dot(np.transpose(norm_X), norm_X)
    # Calculate the eigenvectors and eigenvalues
    eig_val, eig_vec = np.linalg.eig(scatter_matrix)
    eig_pairs = [
        (np.abs(eig_val[i]), eig_vec[:, i])
        for i in range(n_features)
    ]
    # sort eig_vec based on eig_val from highest to lowest
    eig_pairs.sort(reverse=True)
    # select the top k eig_vec
    feature = np.array([ele[1] for ele in eig_pairs[:k]])
    # get new data
    data = np.dot(norm_X, np.transpose(feature))
    return data


X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])

print(pca(X, 1))