您当前的位置: 首页 > 

宝哥大数据

暂无认证

  • 0浏览

    0关注

    1029博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

PCA(主成分分析)

宝哥大数据 发布时间:2019-12-03 16:26:30 ,浏览量:0

1.1、主成分分析( Principal Component Analysis, PCA)。

  在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复, 重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理。

  那么,我们如何得到这些包含最大差异性的主成分方向呢?事实上,通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值及特征向量,选择特征值最大(也即包含方差最大)的N个特征所对应的特征向量组成的矩阵,我们就可以将数据矩阵转换到新的空间当中,实现数据特征的降维(N维)。

既然,说到了协方差矩阵,那么这里就简单说一下方差和协方差之间的关系,首先看一下均值,方差和协方差的计算公式:   在这里插入图片描述  由上面的公式,我们可以得到一下两点区别:

(1)方差的计算公式,我们知道方差的计算是针对一维特征,即针对同一特征不同样本的取值来进行计算得到;而协方差则必须要求至少满足二维特征。可以说方差就是协方差的特殊情况。

(2)方差和协方差的除数是n-1,这样是为了得到方差和协方差的无偏估计。具体推导过程可以参见博文:http://blog.csdn.net/maoersong/article/details/21823397

1.2、代码实现 1.2.1、加载数据
def loadDataSet(fileName, delim='\t'):
    fr = open(fileName)
    datArr = []
    for line in fr.readlines():
        curLine = line.strip().split(delim)
        curList = []
        for cl in curLine:
            curList.append(a)
        datArr.append(curList)
    return mat(datArr)
1.2.2、pca算法实现
def pca(dataMat, topNfeat=100):
    '''
    pca特征维度压缩函数 
    :param dataMat: 数据集矩阵 
    :param topNfeat: 需要保留的特征维度
    :return: 
    '''

    # 按列计算平均值
    meanVals = mean(dataMat, axis=0)

    # 计算协方差矩阵
    meanRemoved = dataMat - meanVals  # remove mean
    covMat = cov(meanRemoved, rowvar=0)

    # 特征值,特征向量
    eigVals, eigVects = linalg.eig(mat(covMat))
    print(eigVals)
    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

1.3、示例:PCA对半导体数据进行降维 1.3.1、处理缺失数据
def replaceNanWithMean(filename='secom.data', delim=' '):
    datMat = loadDataSet(filename, delim)
    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
关注
打赏
1587549273
查看更多评论
立即登录/注册

微信扫码登录

0.1456s