[机器学习之13]降维技术——主成分分析PCA

    始终贯彻数据分析的一个大问题就是对数据和结果的展示,我们都知道在低维度下数据处理比较方便,因而数据进行简化成为了一个重要的技术。对数据进行简化的原因:

1.使得数据集更易用使用。2、降低很多算法的计算开销。3、去除噪音、4.使得结果易懂

这里我们关心的数据降维技术为主成分分析(PCA)。在PCA中,数据原来的坐标系转换成了新的坐标系,新的坐标系是由数据本身决定的。第一个新的坐标轴的选择是原始数据中方差最大的方向,第二个新的坐标轴的选择和第一个坐标轴正交且具有最大方差方向。这个过程一直重复,重复次数为原始数据中的特征的数目。我们会发现大部分方差都包含在最前面的几个新的坐标轴中,因此可以忽略剩下的坐标轴,即完成降维操作。

第一个主成分就是从数据差异性最大(方差最大)的方向提取出来的,第二个主成分则来自于数据差异性次大的方向,并且该方向与第一个主成分是正交的。通过数据集的协方差及其特征值分析,我们就可以求得这些主成分的值。一旦得到协方差矩阵的特征值,我们就可以保留最大的N个值。这些特征向量也给出了N个最重要特征的真实结构。

ps:特征值分析:学过线性代数的都知道,特征值通过该数据的一般格式来揭示数据的‘真实’特征。 在Av=βv中,v是特征向量,β是特征值。

用Python实现PCA的伪代码如下:

将数据转换成前N个主成分的伪代码如下:

去除平均值
计算协方差矩阵
计算协方差矩阵的特征值和特征向量
将特征值从小到大排列
保留最上面的N个特征向量
将数据装换到上述N个特征向量构建的新空间内
def pca(dataMat,topNfeat=9999999):
    meanVals=mean(dataMat,axis=0)   ##平均值
    meanRemoved=dataMat-meanVals
    covMat=cov(meanRemoved,rowvar=0)  ###协方差矩阵
    eigVals,eigVects=lg.eig(mat(covMat))  ###特征向量 特征值
    eigValsInd=argsort(eigVals)   ###特征值进行排序
    eigValsInd=eigValsInd[:-(topNfeat+1):-1]   ###返回前N个
    redEigVects=eigVects[:,eigValsInd]
    lowDDataMat=meanRemoved*redEigVects         ####降维后的数据
    reconMat=(lowDDataMat*redEigVects.T)+meanVals
    return lowDDataMat,reconMat

 用该代码运行一个由1000个数据点组成的数据集

dataMat=loadDataSet('testSet.txt')
    lowDMat,reconMat=pca(dataMat,2)
    # print(shape(lowDMat))
    fig=plt.figure()
    ax=fig.add_subplot(111)
    ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90,color='g')
    ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,color='r')
    plt.show()

 

可以看出将数据集中在一维上,且这一维数据包含着全部数据集的主要信息。
PCA现阶段是一个很成熟的技术,在著名的SKlearn库中也包含了该方法。
使用时导入:from sklearn.decomposition import PCA

具体方法见链接:PCA
 

posted on 2016-08-22 21:01  波比12  阅读(1598)  评论(0编辑  收藏  举报

导航