主成份分析 PCA

什么是主成份分析 (PCA) 算法?

  • 一种常用的数据分析技术,主要用于降维和特征提取。它通过线性变换将原始数据变换为一组各维度线性无关的表示,即主成分,这些主成分能够反映原始数据的主要变异信息。
  • 使用单值分解法对数据进行线性降维,将其投射到一个较低维度的空间。在应用 SVD 之前,对输入数据进行居中处理,但不对每个特征进行缩放
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     >>> import numpy as np
    >>> from sklearn.decomposition import PCA
    >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    >>> pca = PCA(n_components=2)
    >>> pca.fit(X)
    PCA(n_components=2)
    >>> print(pca.explained_variance_ratio_)
    [0.9924... 0.0075...]
    >>> print(pca.singular_values_)
    [6.30061... 0.54980...]

主成分分析(PCA)思想总结?

  • PCA 就是将高维的数据通过线性变换投影到低维空间上去
  • 投影思想:找出最能够代表原始数据的投影方法。被 PCA 降掉的那些维度只能是那些噪声或是冗余的数据
  • 去冗余:去除可以被其他向量代表的线性相关向量,这部分信息量是多余的
  • 去噪声,去除较小特征值对应的特征向量,特征值的大小反映了变换后在特征向量方向上变换的幅度,幅度越大,说明这个方向上的元素差异也越大,要保留
  • 对角化矩阵,寻找极大线性无关组,保留较大的特征值,去除较小特征值,组成一个投影矩阵,对原始样本矩阵进行投影,得到降维后的新样本矩阵
  • 完成 PCA 的关键是 —— 协方差矩阵。协方差矩阵,能同时表现不同维度间的相关性以及各个维度上的方差。协方差矩阵度量的是维度与维度之间的关系,而非样本与样本之间
  • 之所以对角化,因为对角化之后非对角上的元素都是 0,达到去噪声的目的。对角化后的协方差矩阵,对角线上较小的新方差对应的就是那些该去掉的维度。所以我们只取那些含有较大能量 (特征值) 的维度,其余的就舍掉,即去冗余

什么是增量 PCA?

  • 对于大型数据集有一定的限制。最大的限制是 PCA 只支持批处理,这意味着所有要处理的数据必须适合主内存。该 IncrementalPCA 对象使用不同形式的处理,并允许部分计算几乎完全匹配 PCA 以小批量方式处理数据的结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     >>> from sklearn.datasets import load_digits
    >>> from sklearn.decomposition import IncrementalPCA
    >>> from scipy import sparse
    >>> X, _ = load_digits(return_X_y=True)
    >>> transformer = IncrementalPCA(n_components=7, batch_size=200)
    >>> # either partially fit on smaller batches of data
    >>> transformer.partial_fit(X[:100, :])
    IncrementalPCA(batch_size=200, n_components=7)
    >>> # or let the fit function itself divide the data into batches
    >>> X_sparse = sparse.csr_matrix(X)
    >>> X_transformed = transformer.fit_transform(X_sparse)
    >>> X_transformed.shape
    (1797, 7)

什么是稀疏主成分分析(SparsePCA 和 MiniBatchSparsePCA)?

  • SparsePCA 是 PCA 的一种变体,目的是提取最能重构数据的稀疏分量集
  • Mini-batch sparse PCA ( MiniBatchSparsePCA) 是它的一种变体 SparsePCA,速度更快但准确度较低。对于给定的迭代次数,通过迭代特征集的小块来提高速度
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     >>> import numpy as np
    >>> from sklearn.datasets import make_friedman1
    >>> from sklearn.decomposition import SparsePCA
    >>> X, _ = make_friedman1(n_samples=200, n_features=30, random_state=0)
    >>> transformer = SparsePCA(n_components=5, random_state=0)
    >>> transformer.fit(X)
    SparsePCA(...)
    >>> X_transformed = transformer.transform(X)
    >>> X_transformed.shape
    (200, 5)
    >>> # most values in the components_ are zero (sparsity)
    >>> np.mean(transformer.components_ == 0)
    0.9666...

什么是核主成分分析 (kPCA)?

  • KernelPCA 是 PCA 的扩展,它通过使用内核来实现非线性降维。它有许多应用,包括去噪、压缩和结构化预测(内核依赖估计)
    1
    2
    3
    4
    5
    6
    7
     >>> from sklearn.datasets import load_digits
    >>> from sklearn.decomposition import KernelPCA
    >>> X, _ = load_digits(return_X_y=True)
    >>> transformer = KernelPCA(n_components=7, kernel='linear')
    >>> X_transformed = transformer.fit_transform(X)
    >>> X_transformed.shape
    (1797, 7)