主成份分析 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)