主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA,下面我们就对PCA的原理做一个总结。

1. PCA的思想

    PCA顾名思义,就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据。具体的,假如我们的数据集是n维的,共有m个数据$(x^{(1)},x^{(2)},...,x^{(m)})$。我们希望将这m个数据的维度从n维降到n'维,希望这m个n'维的数据集尽可能的代表原始数据集。我们知道数据从n维降到n'维肯定会有损失,但是我们希望损失尽可能的小。那么如何让这n'维的数据尽可能表示原来的数据呢?

    我们先看看最简单的情况,也就是n=2,n'=1,也就是将数据从二维降维到一维。数据如下图。我们希望找到某一个维度方向,它可以代表这两个维度的数据。图中列了两个向量方向,$u_1$和$u_2$,那么哪个向量可以更好的代表原始数据集呢?从直观上也可以看出,$u_2$比$u_1$好。

    为什么$u_2$比$u_1$好呢?可以有两种解释,第一种解释是样本点到这个直线的距离足够近,第二种解释是样本点在这个直线上的投影能尽可能的分开。

    假如我们把n'从1维推广到任意维,则我们的希望降维的标准为:样本点到这个超平面的距离足够近,或者说样本点在这个超平面上的投影能尽可能的分开。

    基于上面的两种标准,我们可以得到PCA的两种等价推导。

2. PCA的推导:基于小于投影距离

    我们首先看第一种解释的推导,即样本点到这个超平面的距离足够近。

    假设m个n维数据$(x^{(1)}, x^{(2)},...,x^{(m)})$都已经进行了标准化,即$\sum\limits_{i=1}^{m}x^{(i)}=0$。经过投影变换后得到的新坐标系为$\{w_1,w_2,...,w_n\}$,其中$w$是标准正交基,即$||w||_2=1, w_i^Tw_j=0$。

    如果我们将数据从n维降到n'维,即丢弃新坐标系中的部分坐标,则新的坐标系为$\{w_1,w_2,...,w_{n'}\}$,样本点$x^{(i)}$在n'维坐标系中的投影为:$z^{(i)} = (z_1^{(i)}, z_2^{(i)},...,z_{n'}^{(i)})$.其中,$z_j^{(i)} = w_j^Tx^{(i)}$是$x^{(i)}$在低维坐标系里第j维的坐标。

    如果我们用$z^{(i)}$来恢复原始数据$x^{(i)}$,则得到的恢复数据$\overline{x}^{(i)} = \sum\limits_{j=1}^{n'}z_j^{(i)}w_j = Wz^{(i)}$,其中,W为标准正交基组成的矩阵。

    现在我们考虑整个样本集,我们希望所有的样本到这个超平面的距离足够近,即最小化下式:$$\sum\limits_{i=1}^{m}||\overline{x}^{(i)} - x^{(i)}||_2^2$$

    将这个式子进行整理,可以得到:

$$ \begin{align} \sum\limits_{i=1}^{m}||\overline{x}^{(i)} - x^{(i)}||_2^2 & = \sum\limits_{i=1}^{m}|| Wz^{(i)} - x^{(i)}||_2^2 \\& = \sum\limits_{i=1}^{m}(Wz^{(i)})^T(Wz^{(i)}) - 2\sum\limits_{i=1}^{m}(Wz^{(i)})^Tx^{(i)} + \sum\limits_{i=1}^{m} x^{(i)T}x^{(i)} \\& = \sum\limits_{i=1}^{m}z^{(i)T}z^{(i)} - 2\sum\limits_{i=1}^{m}z^{(i)T}W^Tx^{(i)} +\sum\limits_{i=1}^{m} x^{(i)T}x^{(i)} \\& = \sum\limits_{i=1}^{m}z^{(i)T}z^{(i)} - 2\sum\limits_{i=1}^{m}z^{(i)T}z^{(i)}+\sum\limits_{i=1}^{m} x^{(i)T}x^{(i)}  \\& = - \sum\limits_{i=1}^{m}z^{(i)T}z^{(i)} + \sum\limits_{i=1}^{m} x^{(i)T}x^{(i)}  \\& =   -tr( W^T(\sum\limits_{i=1}^{m}x^{(i)}x^{(i)T})W)  + \sum\limits_{i=1}^{m} x^{(i)T}x^{(i)} \\& =  -tr( W^TXX^TW)  + \sum\limits_{i=1}^{m} x^{(i)T}x^{(i)}  \end{align}$$

    其中第(1)步用到了$\overline{x}^{(i)}=Wz^{(i)} $,第二步用到了平方和展开,第(3)步用到了矩阵转置公式$(AB)^T =B^TA^T$和$W^TW=I$,第(4)步用到了$z^{(i)}=W^Tx^{(i)}$,第(5)步合并同类项,第(6)步用到了$z^{(i)}=W^Tx^{(i)}$和矩阵的迹,第7步将代数和表达为矩阵形式。

    注意到$\sum\limits_{i=1}^{m}x^{(i)}x^{(i)T}$是数据集的协方差矩阵,W的每一个向量$w_j$是标准正交基。而$\sum\limits_{i=1}^{m} x^{(i)T}x^{(i)}$是一个常量。最小化上式等价于:$$\underbrace{arg\;min}_{W}\;-tr( W^TXX^TW) \;\;s.t. W^TW=I$$

    这个最小化不难,直接观察也可以发现最小值对应的W由协方差矩阵$XX^T$最大的n'个特征值对应的特征向量组成。当然用数学推导也很容易。利用拉格朗日函数可以得到$$J(W) = -tr( W^TXX^TW) + \lambda(W^TW-I)$$

    对W求导有$-XX^TW+\lambda W=0$, 整理下即为:$$XX^TW=\lambda W$$

    这样可以更清楚的看出,W为$XX^T$的n'个特征向量组成的矩阵,而$\lambda$为$XX^T$的特征值。当我们将数据集从n维降到n'维时,需要找到最大的n'个特征值对应的特征向量。这n'个特征向量组成的矩阵W即为我们需要的矩阵。对于原始数据集,我们只需要用$z^{(i)}=W^Tx^{(i)}$,就可以把原始数据集降维到最小投影距离的n'维数据集。

    如果你熟悉谱聚类的优化过程,就会发现和PCA的非常类似,只不过谱聚类是求前k个最小的特征值对应的特征向量,而PCA是求前k个最大的特征值对应的特征向量。  

3. PCA的推导:基于最大投影方差

    现在我们再来看看基于最大投影方差的推导。

假设m个n维数据$(x^{(1)}, x^{(2)},...,x^{(m)})$都已经进行了标准化,即$\sum\limits_{i=1}^{m}x^{(i)}=0$。经过投影变换后得到的新坐标系为$\{w_1,w_2,...,w_n\}$,其中$w$是标准正交基,即$||w||_2=1, w_i^Tw_j=0$。

    如果我们将数据从n维降到n'维,即丢弃新坐标系中的部分坐标,则新的坐标系为$\{w_1,w_2,...,w_{n'}\}$,样本点$x^{(i)}$在n'维坐标系中的投影为:$z^{(i)} = (z_1^{(i)}, z_2^{(i)},...,z_{n'}^{(i)})$.其中,$z_j^{(i)} = w_j^Tx^{(i)}$是$x^{(i)}$在低维坐标系里第j维的坐标。

    对于任意一个样本$x^{(i)}$,在新的坐标系中的投影为$W^Tx^{(i)}$,在新坐标系中的投影方差为$W^Tx^{(i)}x^{(i)T}W$,要使所有的样本的投影方差和最大,也就是最大化$ \sum\limits_{i=1}^{m}W^Tx^{(i)}x^{(i)T}W$,即:$$\underbrace{arg\;max}_{W}\;tr( W^TXX^TW) \;\;s.t. W^TW=I$$

    观察第二节的基于最小投影距离的优化目标,可以发现完全一样,只是一个是加负号的最小化,一个是最大化。

    利用拉格朗日函数可以得到$$J(W) = tr( W^TXX^TW) + \lambda(W^TW-I)$$

    对W求导有$XX^TW+\lambda W=0$, 整理下即为:$$XX^TW=(-\lambda)W$$

    和上面一样可以看出,W为$XX^T$的n'个特征向量组成的矩阵,而$-\lambda$为$XX^T$的特征值。当我们将数据集从n维降到n'维时,需要找到最大的n'个特征值对应的特征向量。这n'个特征向量组成的矩阵W即为我们需要的矩阵。对于原始数据集,我们只需要用$z^{(i)}=W^Tx^{(i)}$,就可以把原始数据集降维到最小投影距离的n'维数据集。

4. PCA算法流程

    从上面两节我们可以看出,求样本$x^{(i)}$的n'维的主成分其实就是求样本集的协方差矩阵$XX^T$的前n'个特征值对应特征向量矩阵W,然后对于每个样本$x^{(i)}$,做如下变换$z^{(i)}=W^Tx^{(i)}$,即达到降维的PCA目的。

    下面我们看看具体的算法流程。

    输入:n维样本集$D=(x^{(1)}, x^{(2)},...,x^{(m)})$,要降维到的维数n'.

    输出:降维后的样本集$D'$

    1) 对所有的样本进行中心化: $x^{(i)} = x^{(i)} - \frac{1}{m}\sum\limits_{j=1}^{m} x^{(j)}$

    2) 计算样本的协方差矩阵$XX^T$

    3) 对矩阵$XX^T$进行特征值分解

    4)取出最大的n'个特征值对应的特征向量$(w_1,w_2,...,w_{n'})$, 将所有的特征向量标准化后,组成特征向量矩阵W。

    5)对样本集中的每一个样本$x^{(i)}$,转化为新的样本$z^{(i)}=W^Tx^{(i)}$

    6) 得到输出样本集$D' =(z^{(1)}, z^{(2)},...,z^{(m)})$

    有时候,我们不指定降维后的n'的值,而是换种方式,指定一个降维到的主成分比重阈值t。这个阈值t在(0,1]之间。假如我们的n个特征值为$\lambda_1 \geq \lambda_2 \geq ... \geq \lambda_n$,则n'可以通过下式得到:$$\frac{\sum\limits_{i=1}^{n'}\lambda_i}{\sum\limits_{i=1}^{n}\lambda_i} \geq t $$

5. PCA实例

    下面举一个简单的例子,说明PCA的过程。

    假设我们的数据集有10个二维数据(2.5,2.4), (0.5,0.7), (2.2,2.9), (1.9,2.2), (3.1,3.0), (2.3, 2.7), (2, 1.6), (1, 1.1), (1.5, 1.6), (1.1, 0.9),需要用PCA降到1维特征。

    首先我们对样本中心化,这里样本的均值为(1.81, 1.91),所有的样本减去这个均值后,即中心化后的数据集为(0.69, 0.49), (-1.31, -1.21), (0.39, 0.99), (0.09, 0.29), (1.29, 1.09), (0.49, 0.79), (0.19, -0.31), (-0.81, -0.81), (-0.31, -0.31), (-0.71, -1.01)。

    现在我们开始求样本的协方差矩阵,由于我们是二维的,则协方差矩阵为:

$$\mathbf{XX^T} =
\left( \begin{array}{ccc}
cov(x_1,x_1) & cov(x_1,x_2)\\  
cov(x_2,x_1) & cov(x_2,x_2) \end{array} \right)$$

    对于我们的数据,求出协方差矩阵为:

$$\mathbf{XX^T} =
\left( \begin{array}{ccc}
0.616555556 & 0.615444444\\  
0.615444444 & 0.716555556 \end{array} \right)$$

    求出特征值为(0.490833989, 1.28402771),对应的特征向量分别为:$(0.735178656, 0.677873399)^T\;\; (-0.677873399, -0.735178656)^T$,由于最大的k=1个特征值为1.28402771,对于的k=1个特征向量为$(-0.677873399, -0.735178656)^T$. 则我们的W=$(-0.677873399, -0.735178656)^T$

    我们对所有的数据集进行投影$z^{(i)}=W^Tx^{(i)}$,得到PCA降维后的10个一维数据集为:(-0.827970186, 1.77758033, -0.992197494, -0.274210416, -1.67580142, -0.912949103, 0.0991094375, 1.14457216, 0.438046137, 1.22382056)

6. 核主成分分析KPCA介绍

    在上面的PCA算法中,我们假设存在一个线性的超平面,可以让我们对数据进行投影。但是有些时候,数据不是线性的,不能直接进行PCA降维。这里就需要用到和支持向量机一样的核函数的思想,先把数据集从n维映射到线性可分的高维N>n,然后再从N维降维到一个低维度n', 这里的维度之间满足n'<n<N。

    使用了核函数的主成分分析一般称之为核主成分分析(Kernelized PCA, 以下简称KPCA。假设高维空间的数据是由n维空间的数据通过映射$\phi$产生。

    则对于n维空间的特征分解:$$ \sum\limits_{i=1}^{m}x^{(i)}x^{(i)T}W=\lambda W$$

    映射为:$$ \sum\limits_{i=1}^{m}\phi(x^{(i)})\phi(x^{(i)})^TW=\lambda W$$

    通过在高维空间进行协方差矩阵的特征值分解,然后用和PCA一样的方法进行降维。一般来说,映射$\phi$不用显式的计算,而是在需要计算的时候通过核函数完成。由于KPCA需要核函数的运算,因此它的计算量要比PCA大很多。

7. PCA算法总结

    这里对PCA算法做一个总结。作为一个非监督学习的降维方法,它只需要特征值分解,就可以对数据进行压缩,去噪。因此在实际场景应用很广泛。为了克服PCA的一些缺点,出现了很多PCA的变种,比如第六节的为解决非线性降维的KPCA,还有解决内存限制的增量PCA方法Incremental PCA,以及解决稀疏数据降维的PCA方法Sparse PCA等。

    PCA算法的主要优点有:

    1)仅仅需要以方差衡量信息量,不受数据集以外的因素影响。 

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

    3)计算方法简单,主要运算是特征值分解,易于实现。

    PCA算法的主要缺点有:

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

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

祝大家新年快乐!

(欢迎转载,转载请注明出处。欢迎沟通交流: pinard.liu@ericsson.com)

主成分分析(PCA)原理总结的更多相关文章

  1. 主成分分析(PCA)原理与实现

    主成分分析原理与实现   主成分分析是一种矩阵的压缩算法,在减少矩阵维数的同时尽可能的保留原矩阵的信息,简单来说就是将 \(n×m\)的矩阵转换成\(n×k\)的矩阵,仅保留矩阵中所存在的主要特性,从 ...

  2. 机器学习之主成分分析PCA原理笔记

    1.    相关背景 在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律.多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的 ...

  3. 主成分分析(PCA)原理及推导

    原文:http://blog.csdn.net/zhongkejingwang/article/details/42264479 什么是PCA? 在数据挖掘或者图像处理等领域经常会用到主成分分析,这样 ...

  4. 主成分分析(PCA)原理详解_转载

    一.PCA简介 1. 相关背景 在许多领域的研究与应用中,往往需要对反映事物的多个变量进行大量的观测,收集大量数据以便进行分析寻找规律.多变量大样本无疑会为研究和应用提供了丰富的信息,但也在一定程度上 ...

  5. 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)

    目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...

  6. 线性判别分析(LDA), 主成分分析(PCA)及其推导【转】

    前言: 如果学习分类算法,最好从线性的入手,线性分类器最简单的就是LDA,它可以看做是简化版的SVM,如果想理解SVM这种分类器,那理解LDA就是很有必要的了. 谈到LDA,就不得不谈谈PCA,PCA ...

  7. 一步步教你轻松学主成分分析PCA降维算法

    一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...

  8. PCA原理分析

    动机 在机器学习领域中,我们常常会遇到维数很高的数据,有些数据的特征维度高达上百万维,很显然这样的数据是无法直接计算的,而且维度这么高,其中包含的信息一定有冗余,这时就需要进行降维,总的来说,我们降维 ...

  9. 主成分分析(PCA)模型概述

    数据降维 降维是对数据高维度特征的一种预处理方法.降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的.在实际的生产和应用中,降维在一定信息损失范围内,可 ...

  10. 运用sklearn进行主成分分析(PCA)代码实现

    基于sklearn的主成分分析代码实现 一.前言及回顾 二.sklearn的PCA类介绍 三.分类结果区域可视化函数 四.10行代码完成葡萄酒数据集分类 五.完整代码 六.总结 基于sklearn的主 ...

随机推荐

  1. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  2. Android GridView 通过seletor 设置状态和默认状态

    Android中可以通过selector控制GridView Item 的状态,而省去使用代码控制 GridView View Selector Xml文件 <?xml version=&quo ...

  3. ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件

    虽然ASP.NET Core是一款"动态"的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件.CSS样式文件和图片文件 ...

  4. JavaScript动画-碰撞检测

    ▓▓▓▓▓▓ 大致介绍 碰撞检测是指在页面中有多个元素时,拖拽一个元素会出现碰撞问题,碰撞检测是以模拟拖拽和磁性吸附中的范围限定为基础的 效果:碰撞检测 ▓▓▓▓▓▓ 碰撞检测 先来看看碰撞检测的原理 ...

  5. QT5利用chromium内核与HTML页面交互

    在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...

  6. [C#] 走进异步编程的世界 - 开始接触 async/await

    走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...

  7. [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数

    了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数 目录 简介 特点 方法的参数 方法的返回值 与批处理交互的一个示例 简介 我们知道,新建一个控制台应用程序的时候,IDE 会同时创建 ...

  8. kafka源码分析之一server启动分析

    0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...

  9. History API与浏览器历史堆栈管理

    移动端开发在某些场景中有着特殊需求,如为了提高用户体验和加快响应速度,常常在部分工程采用SPA架构.传统的单页应用基于url的hash值进行路由,这种实现不存在兼容性问题,但是缺点也有--针对不支持o ...

  10. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...