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)方差小的主成分也有可能含有对样本差异的重要信息,由于降维丢弃可能会对后续数据处理有影响

  • 相关阅读:
    深刻理解ajax的success和error的实质和执行过程
    再次遇到 js报错: expected expression, get ')' 或 get ';', '<'等错误?
    怎样让一行中的 文字 input输入框 按钮button它们在同一个高度上? 它们中的文字 是 垂直居中对齐
    怎样阻止input file文件域的change/onchange事件多次重复执行?
    如何在 messager/alert/confirm等消息提示框中 获取 / 设置 嵌入 html内容中的 input[type=checkbox]等的选中状态?
    异步函数造成的问题: 怎样确保异步执行的FileReader onload成功后才执行后面的语句?
    如何退出vim的宏记录模式
    bs模态框中的form获取或设置表单及其中元素用nam不能用id?
    关于git 的理解3
    关于git的理解2
  • 原文地址:https://www.cnblogs.com/xxxxxxxxx/p/11594647.html
Copyright © 2011-2022 走看看