本文主要记录本人在学习机器学习过程中的相关代码实现,参考《机器学习实战》
主成分分析( 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