降维的目的是对输入的数目进行削减,由此剔除数据中的噪声并提高机器学习方法的性能,同时使得数据变得更易使用,使得机器学习任务更加精确。
现有的主要的降维技术:(1) 主成分分析( PCA : Principal Component Analysis)
(2) 因子分析(FA)
(3) 独立成分分析(ICA)
主成分分析的关键步骤:
(1) 去除平均值
(2) 计算协方差矩阵
(3)计算协方差矩阵的特征值和特征向量
(4)将特征值从大到小排序
(5) 保留最上面的N个特征向量
(6) 将数据转换到上述N个特征向量构建的新空间中。
PCA可以从数据中识别器主要特征,它是通过沿着数据最大方差方向旋转坐标轴来实现的。选择方差最大的方向作为第一条坐标轴,后续坐标轴则与前面的坐标轴正交,协方差矩阵上的特征值分析可以用一系列的正交坐标轴来获取。
主成分分析(PCA)的代码实现如下:
from numpy import *
def loadDataSet(fileName, delim='\t'):
fr = open(fileName)
stringArr = [line.strip().split(delim) for line in fr.readlines()]
datArr = [map(float,line) for line in stringArr]
return mat(datArr)
#PCA算法
def pca(dataMat, topNfeat=9999999):
meanVals = mean(dataMat, axis=0)
meanRemoved = dataMat - meanVals #remove mean
covMat = cov(meanRemoved, rowvar=0)
eigVals,eigVects = linalg.eig(mat(covMat))
eigValInd = argsort(eigVals) #sort, sort goes smallest to largest
eigValInd = eigValInd[:-(topNfeat+1):-1] #cut off unwanted dimensions
redEigVects = eigVects[:,eigValInd] #reorganize eig vects largest to smallest
lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions
reconMat = (lowDDataMat * redEigVects.T) + meanVals
return lowDDataMat, reconMat
#将NaN替换成平均值得函数
def replaceNanWithMean():
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