# -*-coding:utf-8-*-
# 13.1 PCA算法
from numpy import *
# 使用两个list comprehension来构建矩阵
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()的两个参数:用于进行PCA操作的数据集,可选参数-应用的N个特征
# 如果不指定topNfeat值,那么函数就会返回前9999999个特征,或者原始数据中全部的特征
def pca(dataMat, topNfeat = 9999999):
meanVals = mean(dataMat, axis=0)
# 首先计算并肩去原始数据集的平均值
meanRemoved = dataMat - meanVals
# 然后计算协方差矩阵及其特征值
covMat = cov(meanRemoved, rowvar=0)
eigVals, eigVects = linalg.eig(mat(covMat))
# 利用argsort()函数对特征值进行从小到大排序,
eigValInd = argsort(eigVals)
# 根据特征值排序结果的逆序就可以得到topNfeat个最大的特征向量
eigValInd = eigValInd[:-(topNfeat+1):-1]
redEigVects = eigVects[:,eigValInd]
# 这些特征向量将构成后面对数据进行转换的矩阵,该矩阵则利用N个特征将原始数据转换到新空间中
lowDDataMat = meanRemoved*redEigVects
# 子厚,原始数据被重构后返回用于调试,同时降维之后的数据集也被返回了
reconMat = (lowDDataMat*redEigVects.T) + meanVals
return lowDDataMat, reconMat
# 13.2 将NaN替换成平均值的函数
def replaceNanWithMean():
# 打开数据集
datMat = loadDataSet('secom.data',' ')
# 计算其特征的数目
numFeat = shape(datMat)[1]
# 然后在特征值上进行循环,
for i in range(numFeat):
# 对每个特征值,计算出非NaN值的平均值
meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i])
# 然后,将所有NaN值替换为该平均值
datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal
return datMat
07-06
07-06
07-07
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交