PCA降维(《Machine Learning in Action》笔记)

降维:对数据进行简化。使数据集更易使用,降低算法计算开销,去除噪声,使结果更易懂。

主成分分析(Principal Component Analysis, PCA),将数据从原来的坐标系转换到了新的坐标系。第一个新坐标系轴选择的是原始数据方差最大的方向,第二个新坐标系轴的选择和第一个坐标系轴正交且具有最大方差的方向。一直重复原始数据中特征数目次。大部分方差都包含在最前面的几个新坐标轴中,因此可以忽略余下的坐标轴。

优点:降低数据的复杂性,识别最重要的多个特征
缺点:不一定需要,且可能损失有用信息
适用数据类型:数值型数据

import numpy

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 numpy.mat(datArr)

def pca(dataMat, topNfeat = 9999999):
    ''' PCA降维 '''
    meanVals = numpy.mean(dataMat, axis = 0)
    meanRemoved = dataMat - meanVals        #取平均值
    covMat = numpy.cov(meanRemoved, rowvar = 0)     #计算协协方差矩阵
    eigVals, eigVects = numpy.linalg.eig(numpy.mat(covMat))     #计算特征值和特征向量
    eigValInd = numpy.argsort(eigVals)      #对特征值进行排序
    eigValInd = eigValInd[:-(topNfeat + 1):-1]      #取倒数的N个
    redEigVects = eigVects[:, eigValInd]
    lowDDataMat = meanRemoved * redEigVects     #降维后的矩阵
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

dataMat = loadDataSet('testSet.txt')
lowDMat, reconMat = pca(dataMat, 1)
print numpy.shape(lowDMat)

def replaceNanMean():
    ''' 将NaN替换成平均值 '''
    datMat = loadDataSet('secom.data', ' ')
    numFeat = numpy.shape(datMat)[1]        #特征数就是是列数
    for i in range(numFeat):        #所有特征上循环
        meanVal = numpy.mean(datMat[numpy.nonzero(~numpy.isnan(datMat[:, i].A))[0], i])
        datMat[numpy.nonzero(numpy.isnan(datMat[:, i].A))[0], i] = meanVal
    return datMat

PCA会给出数据中所包含的信息量。
数据(data)是指接收的原始材料,其中可能包含噪声和不想关信息。
信息(information)是指数据中的相关部分。

你可能感兴趣的:(机器学习)