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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值