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. java中“@Deprecated”的意思

    例如:Java内在的File类中有如下方法 @Deprecatedpublic URL toURL() throws MalformedURLException {return new URL(&qu ...

  2. JAVA中遇到 UTF-八 序列的字节 1 无效

    UTF-8 序列的字节 1 无效用dom4j操作xml文件, 出现了这个错误.原因是xml文件被创建的时候是ansi码格式. (   UTF-8 序列的字节 1 无效用dom4j操作xml文件, 出现 ...

  3. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  4. BZOJ 1257: [CQOI2007]余数之和sum

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3769  Solved: 1734[Submit][St ...

  5. jenkins中通过git发版操作记录

    之前说到的jenkins自动化构建发版是通过svn方式,今天这里介绍下通过git方式发本的操作记录. 一.不管是通过svn发版还是git发版,都要首先下载svn或git插件.登陆jenkins,依次点 ...

  6. js左右滚动幻灯

    js左右滚动幻灯 点击下载

  7. Spring 3.x jar 包详解 与 依赖关系

    以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...

  8. Broadmann分区

    来源: http://blog.sina.com.cn/s/blog_60a751620100k2hj.html Brodmann areas Name 中文名 Function 1 Somatose ...

  9. Windows 8.1 新增控件之 MenuFlyout

    开始这篇讲解前,我们先来温习一下Flyout 的内容,当触发应用中某个Button 时会有Flyout 出现提示用户该操作接下来将会发生什么.Flyout 简单来说就是一个轻量级信息提示需要用户确认或 ...

  10. 金旭亮老师的Scoekt编程摘要

    Socket提供了众多的属性,还提供了SetSocketOption方法来设置各种选项,对.NET网络应用程序的数据通讯进行“微调”.    Socket的功能出奇地强大,在.NET平台上,它支持以下 ...