• scikitlearn中PCA降维的使用方法


    一 函数:

    sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)

    (1)参数说明:

    n_components

    意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
    类型:int 、float 或者 string,缺省时默认为None,所有成分被保留。

    • 赋值为int,比如 n_components = 1,将把原始数据降到一个维度。
    • 赋值为string,比如 n_components = 'mle',将根据最大似然估计自动选取特征个数n,使得满足所要求的方差百分比。
    • n_components的取值还可以是0-1之间的浮点数,这就表示希望保留的信息量的比例。比如,设置 n_components= 0.95 就表示希望保留95%的信息量,那么PCA就会自动选使得信息量>=95%的特征数量。但在设置n_components为浮点数的同时,需设置参数 svd_solver=‘full’。

    copy

    类型:bool,True或者False,缺省时默认为True。
    意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不 会有任何改变,因为是在原始数据的副本上进行运算;若为默认False,则运行PCA算法后,原始训练数据的 值会改,因为是在原始数据上进行降维计算。

    whiten

    类型:bool,缺省时默认为False

    意义:白化,使得每个特征具有相同的方差。关于“白化”,可参考:Ufldl教程

    二、PCA对象属性:

    n_components_返回所要保留的主成分个数n。

    components_ :返回降维后所保留的各主成分方向,并按照各主成分的方差值大小排序。即返回保留下来的模型的各个特征向量。

    explained_variance_:返回 降维后所保留的n个成分各自的方差。
    explained_variance_ratio_:返回 降维后所保留的n个成分各自的方差占总方差值(含未保留成分部分)的百分比。比例越大,则越主要。(即可解释性方差贡献率,也就是降维后保留的每个新特征信息量占原始数据信息量的比例)。
    mean_
    noise_variance_

    三、PCA对象方法:

    • fit(X,y=None)

    fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。

    fit(X),表示用数据X来训练PCA模型。

    函数返回值:调用fit方法的对象本身。比如pca.fit(X),表示用X对pca这个对象进行训练。

    • transform(X)

    将数据X转换成降维后的数据。当模型训练好后,对于新输入的数据,都可以用transform方法来降维。

    • fit_transform(X)

    用X来训练PCA模型,同时返回降维后的数据。
    newX=pca.fit_transform(X),newX就是降维后的数据。

    • inverse_transform()

    将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)

    此外,还有get_covariance()、get_precision()、get_params(deep=True)、score(X, y=None)等方法,以后用到再补充吧。

    四、for example

    '''
    一、数据集
    '''
    from sklearn.datasets import load_iris
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    # 加载鸢尾花数据集
    iris = load_iris()
    X = iris.data
    y = iris.target
    print("数组维度:", X.shape)  # 二维数组
    iris_dataFrame = pd.DataFrame(X)  # 四维特征矩阵
    print("特征矩阵:\n", iris_dataFrame)

     输出结果:

    数组维度: (150, 4)
    特征矩阵:
            0    1    2    3
    0    5.1  3.5  1.4  0.2
    1    4.9  3.0  1.4  0.2
    2    4.7  3.2  1.3  0.2
    3    4.6  3.1  1.5  0.2
    4    5.0  3.6  1.4  0.2
    ..   ...  ...  ...  ...
    145  6.7  3.0  5.2  2.3
    146  6.3  2.5  5.0  1.9
    147  6.5  3.0  5.2  2.0
    148  6.2  3.4  5.4  2.3
    149  5.9  3.0  5.1  1.8
    
    [150 rows x 4 columns]
    '''
    二、调用PCA建
    '''
    
    from sklearn.decomposition import PCA
    pca = PCA(n_components=None)  # n_components设置降维后的特征数,默认None则保留所有成分
    pca.fit(X)  # 拟合
    
    print('保留的主成分个数:' ,pca.n_components_)
    print('保留的特征向量:\n',pca.components_)
    print('保留的n个主成分各自方差:\n',pca.explained_variance_)
    
    print('保留的n个主成分对原始数据信息累计解释的贡献率:\n',np.cumsum(pca.explained_variance_ratio_))

    输出结果:

    保留的主成分个数: 4
    保留的特征向量:
     [[ 0.36138659 -0.08452251  0.85667061  0.3582892 ]
     [ 0.65658877  0.73016143 -0.17337266 -0.07548102]
     [-0.58202985  0.59791083  0.07623608  0.54583143]
     [-0.31548719  0.3197231   0.47983899 -0.75365743]]
    保留的n个主成分各自方差:
     [4.22824171 0.24267075 0.0782095  0.02383509]
    保留的n个主成分对原始数据信息累计解释的贡献率:
     [0.92461872 0.97768521 0.99478782 1.        ]
    '''
    2.1 根据以上分析,保留前2个成分,信息损失仅2%
    试着直接设置 n_components =2 看看
    
    '''
    # 
    
    pca = PCA(n_components=2)  # n_components设置降维后的特征数
    pca.fit(X)  # 拟合
    pca_new = pca.transform(X) #获取新矩阵
    
    print(pca_new)

    输出结果:(150, 2)可以确定,降维后的数据确实为2个特征

    降维后数组维度: (150, 2)
    降维后的数组:
    [[-2.68412563  0.31939725]
     [-2.71414169 -0.17700123]
     [-2.88899057 -0.14494943]
     [-2.74534286 -0.31829898]
     [-2.72871654  0.32675451]
     [-2.28085963  0.74133045]
    ...
    
    [ 2.41874618  0.3047982 ]
     [ 1.94410979  0.1875323 ]
     [ 1.52716661 -0.37531698]
     [ 1.76434572  0.07885885]
     [ 1.90094161  0.11662796]
     [ 1.39018886 -0.28266094]]
    '''
    2.2 设置n_components ='mle',用最大似然估计自定义主成分个数看看效果
    '''
    
    pca = PCA(n_components='mle')  # n_components设置降维后的特征数
    pca.fit(X)  # 拟合
    
    print('保留的主成分个数:' ,pca.n_components_)
    print('保留的特征向量:\n' ,pca.components_)
    print('保留的%i个主成分各自方差:\n' %pca.n_components_,pca.explained_variance_)
    
    print('保留的%i个主成分对原始数据信息累计解释的贡献率:\n' %pca.n_components_,np.cumsum(pca.explained_variance_ratio_))

    输出结果:可以看最大似然估计判断选取3个成分是最佳的取值。因为选3个原始信息的获取量可以达到很好的效果(99%+信息量)

    保留的主成分个数: 3
    保留的特征向量:
     [[ 0.36138659 -0.08452251  0.85667061  0.3582892 ]
     [ 0.65658877  0.73016143 -0.17337266 -0.07548102]
     [-0.58202985  0.59791083  0.07623608  0.54583143]]
    保留的3个主成分各自方差:
     [4.22824171 0.24267075 0.0782095 ]
    保留的3个主成分对原始数据信息累计解释的贡献率:
     [0.92461872 0.97768521 0.99478782]
    '''
    2.3 设置 n_components =0.95 损失不超过5%的原始数据信息,看看效果
    '''
    pca = PCA(n_components=0.95)  # n_components设置降维后的特征数
    pca.fit(X)  # 拟合
    
    print('保留的主成分个数:' ,pca.n_components_)
    print('保留的特征向量:\n',pca.components_)
    print('保留的%i个主成分各自方差:\n' %pca.n_components_ ,pca.explained_variance_)
    
    print('保留的%i个主成分对原始数据信息累计解释的贡献率:\n'%pca.n_components_ ,np.cumsum(pca.explained_variance_ratio_))

    输出结果:可以看出,新数据选了2个成分,且信息量占比可以达到97%+,满足>=95%

    保留的主成分个数: 2
    保留的特征向量:
     [[ 0.36138659 -0.08452251  0.85667061  0.3582892 ]
     [ 0.65658877  0.73016143 -0.17337266 -0.07548102]]
    保留的2个主成分各自方差:
     [4.22824171 0.24267075]
    保留的2个主成分对原始数据信息累计解释的贡献率:
     [0.92461872 0.97768521]

    【参考】

    【1】为什么要降维

    【2】降维原理

    【3】PCA降维实现

    【4】PCA中n_components(主成分数)的设置

    【5】PCA降维的原理、方法、以及sklearn实现

    【6】PCA(主成分分析法)原理以及应用+python 代码实现 

    【7】【博客园】 Python机器学习笔记:主成分分析(PCA)算法【博主总结的不错,其它也值得看看】

    【8】PCA算法原理(讲解非常清楚)

    【9】知乎【机器学习】降维——PCA(非常详细)

  • 相关阅读:
    spring security 单一账户多地方登陆提醒, ajax 拦截器 Interceptor
    Maven 项目打包发布
    jQuery使用on()绑定动态生成元素的事件无效
    ie下li标签中span加float:right不换行问题解决方案
    IE使用多彩文档上传数据库报错
    对象数组中删除指定元素
    jquery 文本框内容清空
    SQL删除重复数据方法
    静态数据的初始化
    java变量初始化顺序
  • 原文地址:https://www.cnblogs.com/zwt20120701/p/16191479.html
Copyright © 2020-2023  润新知