• PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?


    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 imes 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 - 2lambda 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商).

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

  • 相关阅读:
    常见面试之机器学习算法思想简单梳理
    机器学习其实比你想的更简单
    机器学习自学指南
    机器学习算法之旅
    我们需要解决的机器学习问题
    机器学习常见算法分类汇总
    机器学习算法基础概念学习总结
    github cheat sheet
    ubuntu kylin 14.10 安装deepin_music
    安装k-vim遇到的错误
  • 原文地址:https://www.cnblogs.com/dengdan890730/p/5495078.html
Copyright © 2020-2023  润新知