MLiA笔记_pca

# -*-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

猜你喜欢

转载自blog.csdn.net/weixin_42836351/article/details/81393118
PCA