1,PCA 分类介绍
在 scikit-learn 中, 与 PCA 相关的类都在 sklearn.decomposition 包中. 最常用的 PCA 类就是 sklearn.decomposition.PCA.
原理: 线性映射 (或线性变换), 简单的来说就是将高维空间数据投影到低维空间上, 那么在数据分析上, 我们是将数据的主成分(包含信息量大的维度) 保留下来, 忽略掉对数据描述不重要的成分. 即将主成分维度组成的向量空间作为低维空间, 将高维数据投影到这个空间上就完成了降维的工作.
除了 PCA 类以外, 最常用的 PCA 相关类还有 KernelPCA 类, 在原理篇我们也讲到了, 它主要用于非线性数据的降维, 需要用到核技巧. 因此在使用的时候需要选择合适的核函数并对核函数的参数进行调参.
另外一个常用的 PCA 相关类是 IncrementalPCA 类, 它主要是为了解决单机内存限制的. 有时候我们的样本量可能是上百万 +, 维度可能也是上千, 直接去拟合数据可能会让内存爆掉, 此时我们可以用 IncrementalPCA 类来解决这个问题. IncrementalPCA 先将数据分成多个 batch, 然后对每个 batch 依次递增调用 partial_fit 函数, 这样一步步的得到最终的样本最优降维.
此外还有 SparsePCA 和 MiniBatchSparsePCA. 他们和上面讲到的 PCA 类的区别主要是使用了 L1 的正则化, 这样可以将很多非主要成分的影响度降为 0, 这样在 PCA 降维的时候我们仅仅需要对那些相对比较主要的成分进行 PCA 降维, 避免了一些噪声之类的因素对我们 PCA 降维的影响. SparsePCA 和 MiniBatchSparsePCA 之间的区别则是 MiniBatchSparsePCA 通过使用一部分样本特征和给定的迭代次数来进行 PCA 降维, 以解决在大样本时特征分解过慢的问题, 当然, 代价就是 PCA 降维的精确度可能会降低. 使用 SparsePCA 和 MiniBatchSparsePCA 需要对 L1 正则化参数进行调参.
2,sklearn.decomposition.PCA 参数介绍
PCA 类基本不需要调参, 一般来说, 我们只需要指定我们需要降维到的维度, 或者我们希望降维后的主成分的方差和占原始维度所有特征方差和的比例阈值就可以了.
一, 关于参数
n_components:
意义: PCA 算法中所要保留的主成分个数 n, 也即保留下来的特征个数 n
类型: int 或者 string, 缺省时默认为 None, 所有成分被保留.
赋值为 int, 比如 n_components=1, 将把原始数据降到一个维度.
当然, 我们也可以指定主成分的方差和所占的最小比例阈值, 让 PCA 类自己去根据样本特征方差来决定降维到的维度数, 此时 n_components 是一个 (0,1] 之间的数.
赋值为 string, 比如 n_components='mle', 将自动选取特征个数 n, 使得满足所要求的方差百分比.
copy:
类型: bool,True 或者 False, 缺省时默认为 True.
意义: 表示是否在运行算法时, 将原始训练数据复制一份. 若为 True, 则运行 PCA 算法后, 原始训练数据的值不会有任何改变, 因为是在原始数据的副本上进行运算; 若为 False, 则运行 PCA 算法后, 原始训练数据的值会改, 因为是在原始数据上进行降维计算.
whiten:
类型: bool, 缺省时默认为 False
意义: 白化.
二, PCA 对象属性
components_: 返回具有最大方差的成分.
explained_variance_ratio_: 返回 所保留的 n 个成分各自的方差百分比.
n_components_: 返回所保留的成分个数 n.
四, PCA 对象属性
fit(X,y=None)
fit()可以说是 scikit-learn 中通用的方法, 每个需要训练的算法都会有 fit()方法, 它其实就是算法中的 "训练" 这一步骤. 因为 PCA 是无监督学习算法, 此处 y 自然等于 None.
fit(X), 表示用数据 X 来训练 PCA 模型. 函数返回值: 调用 fit 方法的对象本身. 比如 pca.fit(X), 表示用 X 对 pca 这个对象进行训练.
fit_transform(X)
用 X 来训练 PCA 模型, 同时返回降维后的数据.
newX=pca.fit_transform(X),newX 就是降维后的数据.
inverse_transform()
将降维后的数据转换成原始数据, X=pca.inverse_transform(newX)
transform(X)
将数据 X 转换成降维后的数据. 当模型训练好后, 对于新输入的数据, 都可以用 transform 方法来降维.
3,PCA 实例
下面我们首先用一个简单实例来学习下 scikit-learn 中的 PCA 类使用. 为了方便的可视化让大家有一个直观的认识, 我们这里使用了三维的数据来降维. 首先我们生成随机数据并可视化, 代码如下:
- import numpy as np
- import matplotlib.pyplot as plt
- from mpl_toolkits.mplot3d import Axes3D
- from sklearn.datasets.samples_generator import make_blobs
- import matplotlib.pyplot as plt
- #X 为样本特征, Y 为样本簇类别, 共 1000 个样本, 每个样本 3 个特征, 共 4 个簇
- X, y = make_blobs(n_samples=10000, n_features=3, centers=[[3,3, 3], [0,0,0], [1,1,1], [2,2,2]], cluster_std=[0.2, 0.1, 0.2, 0.2],
- random_state =9)
- fig = plt.figure()
- ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
- plt.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o')
- # 先不降维, 只对数据进行投影, 看看投影后的三个维度的方差分布
- from sklearn.decomposition import PCA
- pca = PCA(n_components=3)
- pca.fit(X)
- # 返回所保留的 n 个成分各自的方差百分比
- print(pca.explained_variance_ratio_)
- print(pca.explained_variance_)
- # 进行降维, 从三维降到 2 维
- pca1 = PCA(n_components=2)
- pca1.fit(X)
- print(pca1.explained_variance_ratio_)
- print(pca1.explained_variance_)
- # 返回所保留的 n 个成分各自的方差百分比
- print(pca1.explained_variance_ratio_)
- print(pca1.explained_variance_)
- '''通过对比, 因为上面三个投影后的特征维度的方差分别为:
- [ 3.78483785 0.03272285 0.03201892], 投影到二维后选择的肯定是前两个特征, 而抛弃第三个特征'''
- # 将降维后的 2 维数据进行可视化
- X_new = pca1.transform(X)
- plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
- plt.show()
与原文有点不同
我使用的是 pca.fit_transform(x)
这个方法
4,PCA 算法总结
作为一个非监督学习的降维方法, 它只需要特征值分解, 就可以对数据进行压缩, 去噪. 因此在实际场景应用很广泛. 为了克服 PCA 的一些缺点, 出现了很多 PCA 的变种, 比如第六节的为解决非线性降维的 KPCA, 还有解决内存限制的增量 PCA 方法 Incremental PCA, 以及解决稀疏数据降维的 PCA 方法 Sparse PCA 等.
PCA 算法的主要优点有:
1)仅仅需要以方差衡量信息量, 不受数据集以外的因素影响.
2)各主成分之间正交, 可消除原始数据成分间的相互影响的因素.
3)计算方法简单, 主要运算是特征值分解, 易于实现.
PCA 算法的主要缺点有:
1)主成分各个特征维度的含义具有一定的模糊性, 不如原始样本特征的解释性强.
2)方差小的非主成分也可能含有对样本差异的重要信息, 因降维丢弃可能对后续数据处理有影响.
----------------
来源: http://www.bubuko.com/infodetail-3198091.html