Skip to content

PCA:主成分分析

1. PCA 介绍

主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维方法,它是一种无监督学习方法,通过线性变换将原始数据映射到一个新的坐标系中,使得映射后的数据在各个坐标轴上的方差最大,从而实现数据的降维。

矩阵分解:EVD 和 SVD 中,我们介绍了特征值分解和奇异值分解的基本方法,本节我们将使用这两种方法进行主成分分析。

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

py
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))