zoukankan      html  css  js  c++  java
  • 【机器学习】Sklearn库主成分分析PCA降维的运用实战

    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)方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。
    ————————————————

    原文链接:https://blog.csdn.net/brucewong0516/article/details/78666763

  • 相关阅读:
    cnblog项目--20190309
    django js引入失效问题
    Python老男孩 day16 函数(六) 匿名函数
    Python老男孩 day16 函数(五) 函数的作用域
    Python老男孩 day15 函数(四) 递归
    Python老男孩 day15 函数(三) 前向引用之'函数即变量'
    Python老男孩 day15 函数(二) 局部变量与全局变量
    Python老男孩 day14 函数(一)
    Python老男孩 day14 字符串格式化
    Python老男孩 day14 集合
  • 原文地址:https://www.cnblogs.com/blogwangwang/p/11520361.html
Copyright © 2011-2022 走看看