zoukankan      html  css  js  c++  java
  • PCA降维

    概念

    在机器学习中经常会碰到一些高维的数据集,而在高维数据情形下会出现数据样本稀疏,距离计算等困难,这类问题是所有机器学习方法共同面临的严重问题,称之为“ 维度灾难 ”。另外在高维特征中容易出现特征之间的线性相关,这也就意味着有的特征是冗余存在的。基于这些问题,降维思想就出现了。

    降维方法有很多,而且分为线性降维和非线性降维,本篇文章主要讲解线性降维中的主成分分析法(PCA)降维。顾名思义,就是提取出数据中主要的成分,是一种数据压缩方法,常用于去除噪声、数据预处理,是机器学习中常见的降维方法。

    PCA的本质就是找一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向是相互正交的。这其实就是找新的正交基的过程,计算原始数据在这些正交基上投影的方差,方差越大,就说明在对应正交基上包含了更多的信息量。可以证明原始数据协方差矩阵的特征值越大,对应的方差越大,在对应的特征向量上投影的信息量就越大。

    PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。

    因此,关键点就在于:如何找到新的投影方向使得原始数据的“信息量”损失最少?

    样本的“信息量”指的是样本在特征方向上投影的方差。方差越大,则样本在该特征上的差异就越大,因此该特征就越重要。在分类问题里,样本的方差越大,越容易将不同类别的样本区分开。

    如上图中共有3个类别的数据,很显然,方差越大,越容易分开不同类别的点。样本在X轴上的投影方差较大,在Y轴的投影方差较小。方差最大的方向应该是中间斜向上的方向(图中红线方向)。如果将样本按照中间斜向上的方向进行映射,则只要一维的数据就可以对其进行分类,相比二维的原数据,就相当降了一维。

    在原始数据更多维的情况下,先得到一个数据变换后方差最大的方向,然后选择与第一个方向正交的方向,该方向是方差次大的方向,如此下去,直到变换出与原特征个数相同的新特征或者变换出前N个特征(在这前N个特征包含了数据的绝大部分信息)。

    参考文献中可以具体了解到前(n)个大特征值对应的特征向量,就是前n个主成分,而且主成分(xi_i)对应的方差(var(xi_i))即等于协方差矩阵的特征值(v)

    在多数情况下,数据的不部分方差集中在较少的几个主成分上,因此,通常一般计算前(k)个主成分就可以了。前(k)个主成分所代表的(n)维原始数据全部方差的比例是

    [frac{sum_{i=1}^k v_i}{sum_{i=1}^n v_i} ]

    通过方差的百分比来计算将数据降到多少维是比较合适的。

    方差是用来描述一维数据的,而协方差可以用来描述多维数据,方差的定义如下:

    [var(x) = frac{sum_{i=1}^n (x_i -ar x)^2}{n-1} ]

    相似的,两个变量的协方差定义如下:

    [cov(x, y) = frac{sum_{i=1}^n (x_i -ar x)(y_i - ar y)}{n - 1} ]

    式中分母是(n-1)而不是(n),是因为这样就能够使用样本的协方差的期望值去更好地逼近总体的协方差,即"无偏估计"。当变量多于两维时,就需要协方差矩阵了。协方差矩阵就是计算多个协方差,变量两两之间计算协方差,因为协方差具有"对称性",即(cov(x, y) = cov(y, x)),所以对于一个(n)维的数据集的协方差矩阵,需要计算(frac{C^2_n}{2})次协方差,而且这个矩阵是对称的。假设数据是3维的,它的协方差矩阵如下:

    [sum = egin{pmatrix} cov(x, x) & cov(x, y) & cov(x, z) \ ... & cov(y ,y) & cov(y, z) \ ... & ... & cov(z, z) \ end{pmatrix} ]

    总之,PCA就是用一个超平面对所有样本进行恰当的表达,这个超平面的维度小于原始维度,所以总是不可避免的会丢失一些信息,所以这也是PCA的缺点。该超平面应该具有以下性质:

    • 最近重构性:样本点到这个超平面的距离都足够近;
    • 最大可分性:样本点在这个超平面上的投影能尽量分开。

    这两种性质能够得到等价推导。

    计算过程

    算法步骤:
    0. 设有m条n维数据。

    1. 将原始数据按列组成n行m列矩阵X
    2. 将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
    3. 求出协方差矩阵
    4. 求出协方差矩阵的特征值及对应的特征向量
    5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
    6. 即为降维到k维后的数据

    PCA计算举例

    使用Demo

    from sklearn.decomposition import PCA
    import numpy as np
    from sklearn.preprocessing import StandardScaler
    
    x = np.array([[10001, 2, 55], [16020, 4, 11], [12008, 6, 33], [13131, 8, 22]])
    # 标准化,可取消
    X_scaler = StandardScaler()
    x = X_scaler.fit_transform(x)
    print(x, "
    ")
    # PCA
    pca = PCA(n_components=0.9)  # 保证降维后的数据保持90%的信息
    pca.fit(x)
    print(pca.transform(x))
    """
    输出:
     [ 1.48440157 -0.4472136  -1.18321596]
     [-0.35938143  0.4472136   0.16903085]
     [ 0.15671236  1.34164079 -0.50709255]]
    
    [[ 2.36863319  0.38298087]
     [-1.50952734  1.23481789]
     [ 0.14360068 -0.58040917]
     [-1.00270653 -1.03738959]]
    """
    

    PCA方法参数n_components,如果设置为整数(x),则表示将数据降至(x)维,如果是小数,则表明降维后保留的信息量比例。

    参考链接

    PCA 降维及python 实现
    python 主成分分析(PCA)降维
    PCA 数学原理
    PCA 计算举例

  • 相关阅读:
    安装jupyter_contrib_nbextensions库
    1.20
    架构之美阅读笔记01
    使用 netcat 数据源测试 Flume
    使用 Avro 数据源测试 Flume
    Tensorflow01-认识张量Tensor
    Spark06-RDD分区、缓存与Checkpoint讲解
    Spark05-RDD算子细谈
    Spark04-RDD入门
    Spark03-Scala面向对象和函数式编程
  • 原文地址:https://www.cnblogs.com/zhhfan/p/11311895.html
Copyright © 2011-2022 走看看