2.2.2.1主成分分析

作者: idatadesign | 来源:发表于2017-11-25 15:44 被阅读101次

    2.2.2特征降维

    特征降维是无监督学习的另一个应用,目的有二:其一,我们会经常在实际项目中遭遇特征维度非常之高的训练样本,而往往又无法借助自己的领域知识人工构建有效特征;其二,在数据表现方面,我们无法用肉眼观测超过三个维度的特征。因此,特征降维不仅重构了有效的低纬度特征向量,同时也为数据展现提供了可能。

    2.2.2.1主成分分析

    模型介绍:在特征降维的方法中,主成分分析是最为经典和实用的特征降维技术,特别是在辅助图像识别方面有突出表现。

    线性相关矩阵计算样例
    import numpy as np
    #初始化一个2*2的线性相关矩阵
    M=np.array([[1,2],[2,4]])
    #计算2*2线性相关矩阵的秩
    np.linalg.matrix_rank(M,tol=None)
    

    我们有一组2*2的数据[[1,2],[2,4]]。假设这两个数据都反映到一个类别(分类)或者一个类簇(聚类)。如果我们的学习模型是线性模型,那么这两个数据其实只能帮助权重参数更新一次,因为他们线性相关,所有的特征数值都只是扩张了相同的倍数;如果使用pca分析的话,这个矩阵的“秩”是1,也就是说,在多样性程度上,这个矩阵只有一个自由度。

    显示手写体数字图片经PCA压缩后的二维空间分布
    import pandas as pd
    digits_train=pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra',header=None)
    digits_test=pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tes',header=None)
    
    #从训练与测试数据集上都分离出64维度的像素特征与1维度的数字目标
    X_digits=digits_train[np.arange(64)]#64个属性值 
    y_digits=digits_train[64]#一个结果值 
    
    from sklearn.decomposition import PCA
    #初始化一个可以将高维度特征向量(六十四维)压缩至二个维度的PCA
    estimator=PCA(n_components=2)
    X_pca=estimator.fit_transform(X_digits)
    
    #显示10类手写体数字图片经PCA压缩后的二维空间分布
    from matplotlib import pyplot as plt
    def plot_pca_scatter():
        #总共有0-9,10种手写数字,要把每一个手写数字都用二维图展现出来,为了便于区分,使用10颜色
        colors=['black','blue','purple','yellow','white','red','line','cyan','orange','gray']
        for i in range(len(colors)):
            px=X_pca[:,0][y_digits.as_matrix()==i]#这里的[y_digits.as_matrix]主要对x_pca第一列的所有行起到选择作用,也就是说假设i=0时,  
            py=X_pca[:,1][y_digits.as_matrix()==i]#选择出所有训练样本的标签为0的x_pca,并将其用二维图展现出来,不同的数字用不同的颜色画出来 
            plt.scatter(px,py,c=colors[i])#最后,通过最终效果图可以发现,同一类型的digits基本上分布在同一块区域
        plt.legend(np.arange(0,10).astype(str))
        plt.xlabel('First Principle Component')
        plt.ylabel('Second Priciple Component')
        plt.title("PCA Scatter Plot")
        plt.show()
    
    plot_pca_scatter()
    
    使用原始像素特征和经PCA压缩重建的低维特征,在相同配置的支持向量(分类)模型上分别进行图像识别
    #对训练数据、测试数据进行特征向量(图片像素)与分类目标的分隔
    X_train=digits_train[np.arange(64)]
    y_train=digits_train[64]
    X_test=digits_test[np.arange(64)]
    y_test=digits_test[64]
    
    #导入基于线性核的支持向量机分类器
    from sklearn.svm import LinearSVC
    #使用默认配置初始化LinearSVC,对原始六十四维像素特征的训练数据进行建模,并在测试数据上做出预测,存储在y_predict中。
    svc=LinearSVC()
    svc.fit(X_train,y_train)
    y_predict=svc.predict(X_test)
    
    #使用PCA将原六十四维的图像数据压缩到20个维度。
    estimator=PCA(n_components=20)
    
    #利用训练特征决定(fit)20个正交维度的方向,并转化(transform)原训练特征。
    pca_X_train=estimator.fit_transform(X_train)
    #测试特征也按照上述的20个正交维度方向进行转化(transform)
    pca_X_test=estimator.transform(X_test)
    
    #使用默认配置初始化LinearSVC,对压缩后的二十维像素特征的训练数据进行建模,并在测试数据上做出预测,存储在pca_y_predict中。
    pca_svc=LinearSVC()
    pca_svc.fit(pca_X_train,y_train)
    pca_y_predict=pca_svc.predict(pca_X_test)
    
    使用原始像素特征和经PCA压缩重建的低维特征,在相同配置的支持向量(分类)模型上识别性能的差异
    from sklearn.metrics import classification_report
    print(svc.score(X_test,y_test))
    print(classification_report(y_test,y_predict,target_names=np.arange(10).astype(str)))
    

    0.936560934891


    print(pca_svc.score(pca_X_test,y_test))
    print(classification_report(y_test,pca_y_predict,target_names=np.arange(10).astype(str)))
    

    0.907067334446


    尽管经过PCA特征压缩和重建之后的特征数据会损失2%左右的预测准确性,但是相比于原始数据六十四维度的特征而言,我们却使用PCA压缩并且降低了68.75%的维度。

    特点分析

    降维/压缩问题则是选取数据具有代表性的特征,在保持数据多样性的基础上,规避掉大量的特征冗余和早死,不过这个过程也很有可能会损失一些有用的模式信息。经过大量的实践证明,相较于损失的少部分模型性能,维度压缩能够节省大量用于模型训练的好时间。这样一来,使得pca所带来的模型综合效率变得更为划算。

    相关文章

      网友评论

        本文标题:2.2.2.1主成分分析

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