zoukankan      html  css  js  c++  java
  • PCA主成分分析进行数据降维

    1、PCA的原理

    PCA:principal component analysis 主成分分析,PCA通过更换数据的坐标系来达到降维的目的。
    第一个坐标轴是原始数据的方差最大的方向,第二个坐标轴是与第一个坐标轴正交并且方差次大的方向

    2、PCA的优缺点

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

    3、PCA伪代码

    '''
    去除平均值
    计算协方差矩阵
    计算协方差矩阵的特征值和特征向量
    将特征值从大到小排序
    保留最上面的#个特征向量
    将数据转换到上述#个特征向量构建的新空间中
    '''

    4、代码准备

    from numpy import *
    import numpy as np
    import matplotlib
    import matplotlib.pyplot as plt
    
    def loadDataSet(fileName, delim='	'):
        fr = open(fileName)
        data = []
        for line in fr.readlines():
           dataLine = list(map(float, line.strip().split(delim)))
           data.append(dataLine)
        return mat(data)
    
    def pca(dataMat, topNfeat=9999999):
        '''
        :param dataMat: 原始数据集
        :param topNfeat: 应用的特征
        :return:
        '''
        meanVals = mean(dataMat, axis=0)
        '''
        axis 不设置值,对 m*n 个数求均值,返回一个实数
    
        axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
        
        axis =1 :压缩列,对各行求均值,返回 m *1 矩阵  
        '''
        meanRemoved = dataMat - meanVals #remove mean
        #计算协方差矩阵
        covMat = cov(meanRemoved, rowvar=0)
        #计算特征值和特征向量
        eigVals,eigVects = linalg.eig(mat(covMat))
        #将特征值按照从小到大的顺序排列,提取出索引值
        eigValInd = argsort(eigVals)            #sort, sort goes smallest to largest
        #从末尾最大的元素开始,步长为-1,一直到-(topNfeat+1)(左闭右开)
        #反转,截取部分索引值
        eigValInd = eigValInd[:-(topNfeat+1):-1]  #cut off unwanted dimensions
        #取出对应特征值对应的特征向量
        #选出topFeat个最大特征向量
        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

    if __name__ == '__main__':
        data_set = loadDataSet("D://pca//testSet.txt",delim='	')
        lowDDataMat, reconMat = pca(data_set,1)
        n = shape(lowDDataMat)
        print(n)
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.scatter(data_set[:,0].flatten().A[0],data_set[:,1].flatten().A[0],marker='^',s = 90,c='lightskyblue')
        ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s = 50,c='yellowgreen')
        plt.show()
    
    (1000, 1)





    欢迎关注我的公众号:小秋的博客 CSDN博客:https://blog.csdn.net/xiaoqiu_cr github:https://github.com/crr121 联系邮箱:rongchen633@gmail.com 有什么问题可以给我留言噢~
  • 相关阅读:
    php面向对象三大特性
    php面向对象的重写与重载
    一组成对的数字,找出不成对的数字
    如何创建dll以及使用
    常见运行时错误
    连续数的和
    绕圆圈取球
    第一章 概述
    错误2038
    一个简单的环境光shader
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10326916.html
Copyright © 2011-2022 走看看