机器学习之利用PCA来简化数据

来源:互联网 发布:如何选择净水器 知乎 编辑:程序博客网 时间:2024/06/05 05:12

本文主要记录本人在学习机器学习过程中的相关代码实现,参考《机器学习实战》

        主成分分析( PrincipalComponentAnalysis,PCA) 是一种数据降维方法。在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理。

        优 点 :降低数据的复杂性,识别最重要的多个特征。
        缺 点 :不一定需要, 且可能损失有用信息。
        适用数据类型:数值型数据。

        将数据转换成前n个主成分的伪码大致如下:
     (1)去除平均值
     (2)计算协方差矩阵
     (3)计算协方差矩阵的特征值和特征向量
     (4)将特征值从大到小排序
     (5)保留最上面的#个特征向量
     (6)将数据转换到上述#个特征向量构建的新空间中

from numpy import *def loadDataSet(fileName, delim='\t'):    fr = open(fileName)    stringArr = [line.strip().split(delim) for line in fr.readlines()]    datArr = [list(map(float,line)) for line in stringArr]    return mat(datArr)def pca(dataMat,topNfeat=9999999):    meanVals=mean(dataMat,axis=0)#按列求平均值    meanRemoved=dataMat-meanVals    covMat=cov(meanRemoved,rowvar=0)    eigVals,eigVects=linalg.eig(mat(covMat))    eigValInd=argsort(eigVals)    eigValInd=eigValInd[:-(topNfeat+1):-1]    redEigVects=eigVects[:,eigValInd]    lowDDataMat=meanRemoved*redEigVects    reconMat=(lowDDataMat*redEigVects.T)+meanVals    return lowDDataMat,reconMat#~ dataMat=loadDataSet('testSet.txt')#~ lowDMat,reconMat=pca(dataMat,1)#~ print(shape(lowDMat))

       pca() 函数有两个参数:第一个参数是用于进行PCA操作的数据集,第二个参数 topNfeat则是一个可选参数 , 即应用的N个特征。如果不指定topNfeat的值 , 那么函数就会返回前 9 999 999个特征,或者原始数据中全部的特征。
       首先计算并减去原始数据集的平均值  。然 后 ,计算协方差矩阵及其特征值 ,接着利用argsort() 函数对特征值进行从小到大的排序。根据特征值排序结果的逆序就可以得到
topNfeat 个最大的特征向量。这些特征向量将构成后面对数据进行转换的矩阵,该矩阵则利用N个特征将原始数据转换到新空间中.最后 ,原始数据被重构后返回用于调试,同时降维之后的数据集也被返回了。

def replaceNanWithMean(): #用于测试更大数据集的替换函数,将空值NaN替换为非NaN值的平均值    datMat = loadDataSet('secom.data', ' ')    numFeat = shape(datMat)[1]    for i in range(numFeat):        meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #values that are not NaN (a number)        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  #set NaN values to mean    return datMat


阅读全文
0 0