zoukankan      html  css  js  c++  java
  • 【机器学习】PCA

    PCA

    PCA 就是找出数据最主要的方面,用数据里最主要的方面来代替原始数据。

    PCA 是最重要的降维方法之一,在数据压缩、消除冗余和数据噪音消除等领域都有广泛的应用。

    1. PCA最大可分性的思想

    最大可分性: 样本点在超平面上的投影尽可能的分开

    2. 基变换(线性变换)

    欲获得原始数据新的表示空间,最简单方法是对原始数据进行基变换(线性变换)。

    3. 方差

    ​ 如何选择一个方向或者基才是最优的?基于PCA最大可分思想,我们要找的方向是降维后损失最小,可以理解为投影后的数据尽可能分得开,而分散程度可以用数学上的方差来表示,因为方差越大数据也就越分散

    4. 协方差

    ​ 在高维变换中,我们希望基变换后选择的各个方向(或者基)是不相关的,这样才能表示更多的信息。数学上使用协方差表示相关性:

    [Cov(a,b) = frac{1}{m} sum_{i=1}^{m}a_ib_i ]

    如果 (Cov(a,b)=0) ,则表示两个字段完全独立,这也是我们的优化目标

    5. 协方差矩阵

    ​ 我们想达到的目标((Cov(a,b)=0)字段内方差字段间协方差 有着密切的关系。假设只有 (a, b) 两个字段,按行组成 (X) ,求取协方差矩阵:

    可见,协方差矩阵是一个对称的矩阵,对角线是各个维度的方差(字段内方差),而其它元素是字段间协方差,两者被统一到了一个矩阵之中。

    6. 协方差矩阵对角化

    ​ 我们的目标是使 (Cov(a,b)=0) ,由协方差矩阵可知我们的优化目标 (C=frac{1}{m}XX^T) 等价于协方差矩阵对角化(除对角线以外的其它元素都为0,并且对角线将元素按照大小从上到下排列)。

    ​ 推导:

    7. PCA算法流程

    输入: (n) 维样本集 (X = (x_1, x_2, ... ,X_m)),要降维到的维数 (n^{'})

    输出: 降维后的样本集 (Y)

    算法:

    ​ 1)对所有样本进行中心化 (x_i = x_i -frac{1}{m}sum_{j=1}^mx_j)

    ​ 2)计算样本的协方差矩阵 (C=frac{1}{m}XX^T)

    ​ 3)求出协方差矩阵的特征值以及对应的特征向量

    ​ 4)将特征向量按对应特征值大小从上到下排列成矩阵,取前 (K) 行组成矩阵 (P)

    ​ 5)(Y=PX) 即为原始样本降维到 (K) 维后的数据矩阵

    代码:

    """
    	这里假设原始数据集为矩阵 dataMat,其中每一行代表一个样本,每一列代表同一个特征(与上面的介绍稍有不同,上	  面是每一列代表一个样本,每一行代表同一个特征)。
    """
    
    import numpy as np
    
    ################################
    # (1)零均值化
    ################################
    def zeroMean(dataMat):        
        meanVal=np.mean(dataMat,axis=0)     #按列求均值(axis=0),即求各个特征的均值  
        newData=dataMat-meanVal  
        return newData,meanVal			   # newData是零均值化后的数据,meanVal是每个特征的均值
    
    
    ################################
    # (2)求协方差矩阵
    # 若rowvar=0,说明传入的数据一行代表一个样本;
    # 若非0,说明传入的数据一列代表一个样本。
    ################################
    newData,meanVal=zeroMean(dataMat)  
    covMat=np.cov(newData,rowvar=0)  	   
    
    
    ################################
    # (3)求特征值和特征矩阵
    # eigVals存放特征值,行向量
    # eigVects存放特征向量,每一列带别一个特征向量
    # 特征值和特征向量是一一对应的
    ################################
    eigVals,eigVects=np.linalg.eig(np.mat(covMat)) 
    
    
    ################################
    # (4)保留比较大的前n个特征向量
    # 第三步得到了特征值向量eigVals,假设里面有m个特征值,我们可以对其排序,排在前面的n个特征值所对应的特征  # 向量就是我们要保留的,它们组成了新的特征空间的一组基n_eigVect
    ################################
    eigValIndice=np.argsort(eigVals)            #对特征值从小到大排序  
    n_eigValIndice=eigValIndice[-1:-(n+1):-1]   #最大的n个特征值的下标,首先argsort对特征值是从小到大排序的,那么最大的n个特征值就排在后面,所以eigValIndice[-1:-(n+1):-1]就取出这个n个特征值对应的下标(python里面,list[a:b:c]代表从下标a开始到b,步长为c)  
    n_eigVect=eigVects[:,n_eigValIndice]        #最大的n个特征值对应的特征向量
    
    
    ################################
    # (5)获取降维后的数据
    # 将零均值化后的数据乘以n_eigVect就可以得到降维后的数据
    ################################
    lowDDataMat=newData*n_eigVect               #低维特征空间的数据  
    reconMat=(lowDDataMat*n_eigVect.T)+meanVal  #重构数据
    

    8. PCA算法总结

    优点:

    ​ 1) 仅仅依靠方差衡量信息量,不受数据集以外的因素影响

    ​ 2)各主成分之间相互正交,可消除原始数据成分间的相互影响的因素

    ​ 3)计算方法简单,主要运用特征值分解

    缺点:

    ​ 1)主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强

    ​ 2)方差小的主成分也有可能含有对样本差异的重要信息,由于降维丢弃可能会对后续数据处理有影响

  • 相关阅读:
    Codechef EDGEST 树套树 树状数组 线段树 LCA 卡常
    BZOJ4319 cerc2008 Suffix reconstruction 字符串 SA
    Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal
    Codeforces 316G3 Good Substrings 字符串 SAM
    Codechef CHSIGN Change the Signs(May Challenge 2018) 动态规划
    BZOJ1396 识别子串 字符串 SAM 线段树
    CodeForces 516C Drazil and Park 线段树
    CodeForces 516B Drazil and Tiles 其他
    CodeForces 516A Drazil and Factorial 动态规划
    SPOJ LCS2
  • 原文地址:https://www.cnblogs.com/xxxxxxxxx/p/11594647.html
Copyright © 2011-2022 走看看