zoukankan      html  css  js  c++  java
  • PCA

    注意协方差的理解:协方差是用来衡量数据相互联系程度的量,协方差矩阵是用来衡量多维数据中每一维的相互联系

    通过协方差计算数据中的主要成分 从而主成分分析。

    机器学习实战 PCA程序

    # -*- coding: utf-8 -*-
    from numpy import *
    import numpy as np
    #加载数据集 与之前有点不同
    def loadDataSet(fileName, delim='	'):
        #打开文本文件
        fr = open(fileName)
        #对文本中的每一行分开
        stringArr = [line.strip().split(delim) for line in fr.readlines()]
        #利用map函数将每一行的数据值映射为float中
        datArr = [map(float,line) for line in stringArr]
        return mat(datArr)
    #主成分分析(参数为数据集和默认维度)
    def pca(dataMat, topNfeat=9999999):
        #求平均值
        meanVals = mean(dataMat, axis=0)
        #移除平均值
        meanRemoved = dataMat - meanVals 
        #计算协方差矩阵
        covMat = cov(meanRemoved, rowvar=0)
        #求解特征向量和特征值
        eigVals,eigVects = linalg.eig(mat(covMat))
        #从小到大排序的索引值
        eigValInd = argsort(eigVals) 
        #从大到小排序的索引值 并剔除多余维度          
        eigValInd = eigValInd[:-(topNfeat+1):-1] 
        #从大到小的特征向量
        redEigVects = eigVects[:,eigValInd]       
        #将数据转换到新的维度(数据乘以N个特征向量)
        lowDDataMat = meanRemoved * redEigVects
        #原矩阵被重构
        reconMat = (lowDDataMat * redEigVects.T) + meanVals
        #返回压缩后的矩阵和由该矩阵重构出来的原矩阵
        return lowDDataMat, reconMat
    #画出降维后的数据和原始数据
    def plotPca():
        filename = 'testSet.txt'
        dataMat=loadDataSet(filename)
        lowDMat,reconMat=pca(dataMat,1)
        import matplotlib
        import matplotlib.pyplot as plt
        fig=plt.figure()
        ax=fig.add_subplot(lll)
        #三角形表示原始数据点
        ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
        #圆形点表示第一主成分点,点颜色为红色
        ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0], marker='o',s=90,c='red')  
    #后面的 利用pca降维半导体数据
    def replaceNanWithMean(): 
        #加载数据集
        datMat = loadDataSet('secom.data', ' ')
        #得到特征数目
        numFeat = shape(datMat)[1]
        #将datMat转换为float
        map(map, [float, float], datMat)
        #在所有的特征上循环 对每个特征向量的每个特征
        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
    '''
    if __name__ == '__main__':
        filename = 'testSet.txt'
        dataMat=loadDataSet(filename)
        lowDMat,reconMat=pca(dataMat,1)
        #画图
        plotPca()
    '''   
  • 相关阅读:
    hdu 3336 Count the string KMP+DP优化
    Codeforces Round #345 (Div. 1) A. Watchmen 模拟加点
    Codeforces Round #345 (Div. 1) B. Image Preview
    大数据时代下EDM邮件营销的变革
    如何选择EDM电子邮件服务提供商
    一般邮件营销平台可以获取的三个参数
    EDM邮件营销真的落伍了吗?
    EDM概念之A/B分类测试法
    EDM营销技巧之如何进行用户唤醒
    如何优化电子邮件营销的效果
  • 原文地址:https://www.cnblogs.com/Aaron12/p/9073909.html
Copyright © 2011-2022 走看看