美文网首页机器学习
用sklearn进行降维的七种方法

用sklearn进行降维的七种方法

作者: 生信阿拉丁 | 来源:发表于2021-06-29 21:10 被阅读0次

    作者:童蒙
    编辑:amethyst

    引言

    在实际的应用中,有时候我们会遇到数据的维度太少,我们需要新生成新的维度,可以用我们之前的分享(如何自动化进行特征工程);有时候维度太多,这时候我们就需要降维了。降维的方法有许多,我们这里介绍了sklearn中介绍的7种,供大家学习和收藏。

    1 PCA

    1.1 普通PCA

    主成分分析(PCA)用于将多维的数据集分解为一组具有最大方差的连续正交分量。在sklearn这个包中,PCA是一个transformer对象,使用fit方法可以选择前n个主成分,并且用于投射到新的数据中。

    PCA有两种实现方式,一种是特征值分解去实现,一种是奇异值分解去实现。特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,如果不使用SVD,PCA只会寻找每个特征的中心,但并不会对数据进行缩放(scaled)。使用参数whiten=True ,可以将数据投射到奇异空间中,并且将每个组分缩放到方差为1,这个对于后续分析中,假设每个特征是isotropy 是很有帮助的,例如SVM和Kmeans聚类。

    PCA不仅仅是对高维数据进行降维,更重要的是经过降维去除了噪声,发现了数据中的模式。PCA把原先的n个特征用数目更少的m个特征取代,新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的m个特征互不相关。

    SVD是一种矩阵分解法,把一个大矩阵分解成易于处理的形式,这种形式可能是两个或多个矩阵的乘积。

    参数

    • n_components:可以是int,float,或者“mle”。如果是int,那么是选择对应的主成分数,如果是float,那么会自动合适的组成份数,使得方差大于float;如果是“mle”,会自动地选择合适的主成分。
    • whiten :白化,使得每个特征具有相同的方差。
      属性
    • components_ :返回具有最大方差的成分。
    • explained_variance_: 各个主成分的解释的方差。
    • explained_variance_ratio_ :返回所保留的n个成分各自的方差百分比。
    • n_components_:返回所保留的成分个数n。
      方法
    • fit() : 对PCA进行训练。
    • fit_transform(): 训练后,进行降维。
    • inverse_transform():将降维后的数据转化成原始数据。
    • transform() : 对训练好的模型,进行转换。
      实例
      例子1 :基本的使用
    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)
    print(pca.explained_variance_ratio_)  ### 获得每个主成分解释的比例
    print(pca.singular_values_)
    

    例子2:获取每个主成分与特征的关系

    from sklearn.datasets import load_iris 
    iris = load_iris()
    from sklearn.decomposition import PCA
    pca = PCA(3)
    X, y = iris.data, iris.target 
    X_proj = pca.fit_transform(X)
    for component in pca.components_:
        print(" + ".join("%.2f x %s" % (value, name) for value, name in zip(component, iris.feature_names)))
    ## 查看累积曲线
    print(pca.explained_variance_ratio_.cumsum())
    

    1.2 增量PCA(IPCA)

    PCA虽然很有用,但是需要将数据全部都存入内存,因此当当要分解的数据集太大,会导致内存很大。这时候,增量主成分分析(IPCA)通常用作主成分分析(PCA)的替代,可以通过部分计算的方式,获得跟PCA一样的结果。

    • 使用partial_fit方法,可以分块的读取数据。
    • 如果是稀疏矩阵或者是内存文件,使用的是numpy.memmap。

    IPCA使用与输入数据样本数无关的内存量为输入数据建立低秩近似。它仍然依赖于输入数据功能,但更改批量大小可以控制内存使用量。

    该函数,增加了一个batch_size的参数,用来控制批次,其余都一样,至此不再赘述。

    实例

    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, :])
    # 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
    

    1.3 使用随机化的SVD的PCA

    对于大型矩阵的分解,我们往往会想到用SVD算法。然而当矩阵的维数与奇异值个数k上升到一定程度时,SVD分解法往往因为内存溢出而失败。因此,Randomized SVD算法,相比于SVD,它更能适应大型矩阵分解的要求,且速度更快。

    此外,在某些场景下,我们期望丢掉某些lower sigular values,来达到减少噪音,保留尽可能多的方差,从而达到更好的预测效果。比如人脸的识别,如果是64X64的像素,那么整个维度有4096个。我们利用这个方法,可以保留重要的维度,从而利于后续的分析。

    使用svd_solver='randomized'可以实现随机化的SVD,来去掉部分的奇异矩阵。

    1.4 Kernel PCA

    主成分分析(Principal Components Analysis, PCA)适用于数据的线性降维。而核主成分分析(Kernel PCA,KPCA)可实现数据的非线性降维,用于处理线性不可分的数据集。kernel的选择有 {'linear', 'poly', 'rbf', 'sigmoid', 'cosine', 'precomputed'},默认是'linear'。

    详细说明见官方说明,与普通的PCA差不多。


    1.5 稀疏化PCA 和minibatchsparsePCA

    SparsePCA 期望找到一组可以最优地重构数据的稀疏主成分。稀疏性的大小由参数alpha给出的L1惩罚系数来控制。Mini-batch sparse PCA是sparsePCA的变种,提高了速度,但是降低了精度。

    主成分分析(PCA)的缺点是,该方法提取的成分是一种密集表达式,即用原始变量的线性组合表示时,它们的系数是非零的。这可能会使解释模型变得困难。在许多情况下,真实的基础分量可以更自然地想象为稀疏向量;例如,在人脸识别中,主成分会只包含部分的图像,映射到人脸的某些部分。稀疏主成分产生了一种更简洁的、可解释的表示,清楚地强调是哪些原始特征导致了样本之间的差异。

    通过调节alpha来调整惩罚度,alpha越大,越导致许多系数为0。

    2 截断SVD

    TruncatedSVD是普通SVD的一个变种,只计算用户指定的前K个奇异值。TSVD通常用于语义分析中,是LSA的其中的一部分,可以解决一词多义和一义多词的问题。

    LSA潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语义,从而解决上节所描述的问题。具体说来就是对一个大型的文档集合使用一个合理的维度建模,并将词和文档都表示到该空间,比如有2000个文档,包含7000个索引词,LSA使用一个维度为100的向量空间将文档和词表示到该空间,进而在该空间进行信息检索。而将文档表示到此空间的过程就是SVD奇异值分解和降维的过程。降维是LSA分析中最重要的一步,通过降维,去除了文档中的“噪音”,也就是无关信息(比如词的误用或不相关的词偶尔出现在一起),语义结构逐渐呈现。相比传统向量空间,潜在语义空间的维度更小,语义关系更明确。

    使用例子如下:

    svd = TruncatedSVD(opts.n_components)
    svd.fit(X)
    svd.transform(X)
    

    3 字典学习

    3.1 使用预定义的字典来稀疏化编码

    用事先预定义好的字典来对矩阵进行稀疏化编码,达到降维和简化的目的。就像人类的所有语言都是由单词组成一样,因此使用已知的词典可以减少维度;其次,稀疏化可以减少计算的成本,让后续的计算更快。

    这个对象没有fit的方法,transformation方法会将数据表示为尽可能少的字典原子的线性组合。可以用transform_method来控制初始化参数,有以下几种:

    • Orthogonal matching pursuit (Orthogonal Matching Pursuit (OMP)):常用于图像处理中。
    • Least-angle regression (Least Angle Regression)
    • Lasso computed by least-angle regression
    • Lasso using coordinate descent (Lasso)
    • Thresholding :速度很快,但是会产生出不准确的重构结构,一般用于文本中。
    coder = SparseCoder(dictionary=D, transform_n_nonzero_coefs=n_nonzero,
                                transform_alpha=alpha, transform_algorithm=algo)
    x = coder.transform(y.reshape(1, -1))
    

    3.2 通用字典学习

    使用的函数为sklearn.decomposition.DictionaryLearning,会找到一个可以将fitted data足够好稀疏化的字典。

    将数据表示为一个overcomplete的字典这个过程,同大脑处理数据的过程类似。这个方法在图像补丁的字典学习已被证明在诸如图像完成、修复和去噪以及监督识别任务的图像处理任务中给出良好的结果。

    dict_learner = DictionaryLearning(
        n_components=15, transform_algorithm='lasso_lars', random_state=42,
    )
    X_transformed = dict_learner.fit_transform(X)
    

    3.3 小批次字典学习

    使用函数为sklearn.decomposition.MiniBatchDictionaryLearning,是一种快速的,但是精确度降低的版本,适应于大数据集合。

    默认情况下,MiniBatchDictionaryLearning将数据分成小批量,并通过在指定次数的迭代中循环使用小批量,以在线方式进行优化。但是,目前它没有退出迭代的停止条件。也可以用partial_fit来实现小批次的fit。

    4 因子分析

    从变量中提取共性因子。

    因子分析要求原有变量间具有较强的相关性,否则,因子分析无法提取变量间的共性特征,如果相关系数小于0.3,则变量间的共线性较小,不适合因子分析;因子分析得到因子和原变量的关系,因此能够对因子进行解释。

    因子分析可以产生与 PCA 相似的特征(载荷矩阵的列)。不过,不能对这些特征做出任何一般性的说明(例如他们是否正交)。

    使用的函数为sklearn.decomposition.FactorAnalysis。

    5 独立成分分析-ICA

    使用的函数为sklearn.decomposition.FastICA,ICA可以提取出一系列的主成分,彼此最大的独立。因此,ICA一般不用于降维,而用于区分叠加信号。ICA不考虑noise,为了使模型正确,必须使用whitening,可以使用whiten这个参数。

    ICA 通常用于分离混合信号(称为盲源分离的问题),也可以作为一种非线性降维方法,可以找到具有一些稀疏性的特征。

    主成分分析假设源信号间彼此非相关,独立成分分析假设源信号间彼此独立。

    主成分分析认为主元之间彼此正交,样本呈高斯分布;独立成分分析则不要求样本呈高斯分布。

    6 非负矩阵分解

    非负矩阵分解,顾名思义就是,将非负的大矩阵分解成两个非负的小矩阵。在数据矩阵不包含负值的情况下,应用NMF而不是PCA或其变体。

    NMF可以产生可以代表数据的主成分,从而可以来解释整个模型。

    参数init,可以用来选择初始化的方法,不同的方法对结果会有不同的表现。

    import numpy as np
    X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
    from sklearn.decomposition import NMF
    model = NMF(n_components=2, init='random', random_state=0)
    W = model.fit_transform(X)
    H = model.components_
    X_new = np.array([[1, 0], [1, 6.1], [1, 0], [1, 4], [3.2, 1], [0, 4]])
    W_new = model.transform(X_new)
    

    在PCA处理中,假使将特征降维为600个,那么降维后的每个人脸都包含了600个特征(所以我们看到降维后的人脸有种“伏地魔”的感觉 ,这是因为降维处理相当于删去了部分细节特征,导致一部分信息丢失,在图片中最直观的体现就是变模糊)。而在NMF的处理中,这1000个特征相当于是被分离了。相当于,一张人脸是由鼻子、耳朵等这些独立的特征叠加出来的。


    7 Latent Dirichlet Allocation (LDA)

    LDA是文档主题生成模型,对离散数据集(如文本语料库)的集合的生成概率模型。它也是一个主题模型,用于从文档集合中发现抽象主题。LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。

    sklearn.decomposition.LatentDirichletAllocation是用于进行LDA的函数。

    lda = LatentDirichletAllocation(n_components=5,
        random_state=0)
    lda.fit(X)
    

    本文主体来源于sklearn的降维这一章,里面有许多数学的知识,还是需要大家自己好好的学习。
    本文对PCA介绍比较详细,但是对于其他的介绍的比较简单,其实各自都有很多的用途,等小编学习后跟大家分享。
    文章中许多内容是借鉴网上的内容,如果有侵权,请跟我们联系,我们会尽快修改。

    参考资料

    1、https://www.jianshu.com/p/1adef2d6dd88
    2、https://www.jianshu.com/p/e574e91070ad
    3、https://scikit-learn.org/stable/modules/decomposition.html#decompositions
    4、https://shankarmsy.github.io/posts/pca-sklearn.html
    5、https://mp.weixin.qq.com/s/Tl9ssjmGdeyNrNuIReo1aw
    6、https://www.cnblogs.com/eczhou/p/5433856.html
    7、https://scikit-learn.org/stable/auto_examples/applications/plot_face_recognition.html#sphx-glr-auto-examples-applications-plot-face-recognition-py
    8、https://blog.csdn.net/fkyyly/article/details/84665361 LSA(Latent semantic analysis)
    9、https://blog.csdn.net/fjssharpsword/article/details/74964127
    10、https://www.jianshu.com/p/e90900a3d03a

    相关文章

      网友评论

        本文标题:用sklearn进行降维的七种方法

        本文链接:https://www.haomeiwen.com/subject/nytfultx.html