PCA, Principle Component Analysis, 主成份分析, 是使用最广泛的降维算法.
......
(关于PCA的算法步骤和应用场景随便一搜就能找到了, 所以这里就不说了. )


假如你要处理一个数据集, 数据集中的每条记录都是一个\(d\)维列向量. 但是这个\(d\)太大了, 所以你希望把数据维度给降下来, 既可以去除一些冗余信息, 又可以降低处理数据时消耗的计算资源(用computation budget 来描述可能更形象).

用稍微正式点的语言描述:

  • 已知:一个数据集\(D\), 记录(或者样本, 或input pattern)\(x_i \in D\) 是\(d\)维列向量.
  • 目标:将每个\(x \in D\) 映射到另一个\(p\)维空间, \(p < d\)(虽然等于也是可以的, 但没什么意义). 得到一个新的数据集\(Z\), 对\(Z\)的要求是尽量保存\(D\)中的有效信息.

那么, 问题就来了. 如何将一个\(d\)维向量映射成一个\(p\)维向量? 答案是基变换. 然而基变换方式不是唯一的, 如何确保变换是最优的? 这就由优化目标"尽量保存原数据集中的信息" 决定了: 最好的基变换能保存最多的信息. 注意了, 这里的比较都是在同一个\(p\)下进行的, 也就是说, 参与竞争的基集(basis set)们, 都把\(d\)维\(D\)映射到了一个新的\(p\)维\(Z\).

那么, (不好意思, 又一个那么. 这不是第一个, 当然也不是最后一个. 是的, 我喜欢用这个词.), 现在面临的问题是, 如何衡量信息的多少? 我并不懂信息科学, 只知道一点, 信息在差异中存在. 如果全是相同的东西, 量再多,它的信息量也没有多少. PCA算法采用方差(variance)来度量信息量.

那么, 如何用variance来度量数据集\(D\)包含的信息量呢? 一个基(basis)一个基地衡量. 数据集在某个基上的投影值(也是在这个基上的坐标值)越分散, 方差越大, 这个基保留的信息也就越多. 不严格的来一句, 一个基集保留下的信息量是每个基保留下的信息量的和.

基于上面的理念, 或者说假设, 我们已经有一种可以有效地找出最优基集的方法了: 贪心算法---先找出保留信息量最大的基向量, 然后是第二大的, 然后然后, 直到找满\(p\)个基向量.

接下来, 将上面的分析用数学语言描述出来.
\(v\)为一个用于变换的基. \(D\)中的某一条记录\(x\)在\(v\)上的投影长度(即坐标值)为: \[proj(x, v) = \frac {v^Tx}{||v||}\]
假如\(v\)为单位向量, 则:\[proj(x, v) = v^Tx\]
所以, 为了方便计算, 我们对\(v\)有了一个约束条件: \(v\)为单位向量. 这个太好说了, normalize 一下就行了.

于是, 整个\(D\)在\(v\)上的投影长度可以打包表示为:\(Xv\), 其中, \(X\)是一个\(m \times d\)的矩阵, 每一行是一条记录, \(m\)是\(D\)中的记录总数目. 在数据预处理时, 我们先将\(X\)每一列的均值变为0: 先算出每一列的均值, 得到均值向量\(\mu\), 然后从每一条记录\(x_i\)中减去\(\mu\): \(x_i \gets x_i - \mu\). 最后用这些预处理后的\(x_i\)组成\(X\).
现在, 我们来计算\(D\)在\(v\)上的信息量, 即所有数据在\(v\)上的投影长度的方差:
\[
\mu (X, v) = 0
\]
\[
info(D, v) = \sigma^2(X, v) = \frac 1m \sum_{i=1}^m (v^Tx_i - \mu)^2 = \frac 1m (Xv)^T Xv = \frac 1m v^T X^T X v
\]
仔细看\(X^T X\)这个东西, 因为做过均值化处理, \(\frac 1m X^T X\), 成为了原数据集\(D\)的协方差矩阵, 用\(C\)表示. 所以
\[
info(D, v) = \sigma^2(X, v) = v^T C v
\]
这就是我们需要最大化的目标函数. 不过, 再回想一下, 我们之前为了方便计算还加了一个条件进来: \(v\)是一个单位向量, 即\(v^Tv = 1\). 把这个条件也加到目标函数里去:
\[
f(v) = v^T C v - \lambda (v^T v - 1)
\]
所以, 这才是我们最终需要优化的目标函数.
now, 求使\(f(v)\)最大的\(v\). \(f(v)\)取得条件极值的必要条件为:
(这个矢量函数求偏导的过程类似于神经网络BP算法求偏导过程, 以后在另一篇文章单独推导.)
\[
\frac {\partial f}{\partial v} = 2Cv - 2\lambda v = 0
\]
\[
Cv = \lambda v
\]
所以, \(v\)为\(C\)的特征向量. 它保存的信息量为:
\[
info(D, v) = v^TCv = v^T \lambda v = \lambda v^Tv = \lambda
\]
于是, 奇迹就这么出现了: 信息量保存能力最大的基向量一定是\(D\)的协方差矩阵的特征向量, 并且这个特征向量保存的信息量就是它对应的特征值.

接下来的戏码你们应该都知道了: 用单位正交阵将\(C\)对角化(\(C\)是对称矩阵, 天生如此);特征值降序排列, 以排名前\(p\)个特征值对应的特征向量作为新的基集. (这个做法看起来很自然, 但若细细思量, 会发现这一步是PCA算法里水最深的一步, 至少我现在还没真正理解为何要这么做, 听qw学长说要用什么Rayleigh商).

剩下的问题, 比如降维后损失了多少信息, 也很明白了, 就不多讲了.

PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?的更多相关文章

  1. 用opencv实现的PCA算法,非API调用

    理论參考文献:但此文没有代码实现.这里自己实现一下,让理解更为深刻 问题:如果在IR中我们建立的文档-词项矩阵中,有两个词项为"learn"和"study",在 ...

  2. 特征值、特征向量与PCA算法

    一.复习几个矩阵的基本知识 1. 向量 1)既有大小又有方向的量成为向量,物理学中也被称为矢量,向量的坐标表示a=(2,3),意为a=2*i + 3*j,其中i,j分别是x,y轴的单位向量. 2)向量 ...

  3. 模式识别(1)——PCA算法

    作者:桂. 时间:2017-02-26  19:54:26 链接:http://www.cnblogs.com/xingshansi/articles/6445625.html 声明:转载请注明出处, ...

  4. 三种方法实现PCA算法(Python)

    主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...

  5. 降维之pca算法

    pca算法: 算法原理: pca利用的两个维度之间的关系和协方差成正比,协方差为0时,表示这两个维度无关,如果协方差越大这表明两个维度之间相关性越大,因而降维的时候, 都是找协方差最大的. 将XX中的 ...

  6. PCA算法学习(Matlab实现)

    PCA(主成分分析)算法,主要用于数据降维,保留了数据集中对方差贡献最大的若干个特征来达到简化数据集的目的. 实现数据降维的步骤: 1.将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩 ...

  7. OpenCV学习(35) OpenCV中的PCA算法

    PCA算法的基本原理可以参考:http://www.cnblogs.com/mikewolf2002/p/3429711.html     对一副宽p.高q的二维灰度图,要完整表示该图像,需要m = ...

  8. 我所认识的PCA算法的princomp函数与经历 (基于matlab)

    我接触princomp函数,主要是因为实验室的项目需要,所以我一接触的时候就希望快点学会怎么用. 项目中需要利用PCA算法对大量数据进行降维. 简介:主成分分析 ( Principal Compone ...

  9. PCA算法理解及代码实现

    github:PCA代码实现.PCA应用 本文算法均使用python3实现 1. 数据降维   在实际生产生活中,我们所获得的数据集在特征上往往具有很高的维度,对高维度的数据进行处理时消耗的时间很大, ...

随机推荐

  1. jQuery学习笔记(一):入门

      jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操 ...

  2. 技术专题—Python黑客【优质内容聚合贴】

    作者:坏蛋链接:https://zhuanlan.zhihu.com/p/24645819来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一.前言 本着知识分享,聚合优 ...

  3. iOS多线程杂论

    iOS多线程的分布 (1) NSThread (2) NSOperation (3) GCD 现在对下面三个进行一个个的分析,希望那里说得不对的地方希望简友们帮我指点一二. 1,NSThread 优点 ...

  4. Android fragment之间消息传递

    1. 在Fragment里定义一个内部接口, 在Fragment初始化方法里, 把父Activity转换成这个接口, 赋值给成员变量 public class DummyFragment extend ...

  5. ESXi 5.5 命令行克隆虚拟机

    1. 开启ESXi的SSH功能,用vSphere Client登录ESXi, 选中服务器, 在右侧标签栏选择Configuration->SecurityProfile->Services ...

  6. PAT 1003. 我要通过!(20)

    "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确&quo ...

  7. Flex String转Date

    在Flex中日期字符串转为Date类型,可以使用静态方法DateFormatter.parseDateString(str:String):Date方法. 该方法支持的字符串格式包括: YYYY-MM ...

  8. Linux Linux下特殊的printf函数和fputs函数

    Linux下,printf函数必须以'\n'结尾才会立刻输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),如果需要不换行的输出,一般可以使用write函数代替.'\n ...

  9. node基础07:写文件

    1.writeFile //server.js var http = require("http"); var writefile = require("./writef ...

  10. Java的性能优化

    http://www.toutiao.com/i6368345864624144897/?tt_from=mobile_qq&utm_campaign=client_share&app ...