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

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

        主成分分析( 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值