最近频繁在论文中看到「PCA」的影子,所以今天决定好好把「PCA」的原理和算法过程弄清楚。

「PCA」是什么

PCA,又称主成分分析,英文全称「Principal Components Analysis」。维基百科上的解释是:「PCA」是一种分析、简化数据集的技术,经常用于减少数据集的维数,同时保持数据集中对方差贡献最大的特征。说得通俗一点,就是把数据集中重要的特征保存下来,把不重要的特征去除掉。

为什么要做这种事情呢?特征越多不是对分析问题更有帮助吗?确实,特征越多,涵盖的信息理论上会越多。但要注意一点,这个假设成立的前提是特征本身都彼此无关,并能描述事物的某些属性。如果由特征 A 可以推出特征 B,或者特征 B 所描述的属性与问题本身无关,或者特征 A 和特征 B 描述的是同一个特征,那么特征 B 是没有价值的。在机器学习里面,特征越多意味着需要更多的训练样本(否则容易 underfit ),但真实情况是,训练数据并不容易获取。基于以上种种,如果能构提取出特征的主要部分,那么,不仅数据将变得简单清晰,训练过程也会更快,效果理论上也会更好才是。

「PCA」算法过程

「PCA」的目标是把原来 n 维特征的数据压缩成 k 维特征。
接下来用一个例子说明「PCA」的执行流程(这个例子参考自文末链接主成分分析(Principal components analysis)-最大方差解释)。

假设我们得到 2 维数据如下:
\[
Data=\begin{array}{c|lcr} x & y \\ \hline 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 \\ \end{array}
\]
行代表样例,列代表特征,这里有 10 个样例,每个样例有两个特征。

step1 归一化样本数据

分别求出 x 和 y 的平均值,对于所有样本,都减去平均值。这里 x 的均值为 1.81,y 的均值为 1.91。归一化后得到:
\[
Data=\begin{array}{c|lcr} x & y \\ \hline 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 \\ \end{array}
\]

step2 求协方差矩阵

由于原样本中的特征是 2 维的,所以得到的协方差矩阵的维度是 \(2*2\) (关于协方差矩阵的求法,参见上一篇文章协方差矩阵)。这里省略过程,直接给出结果:

\(cov=\begin{bmatrix} 0.616555556 & 0.615444444 \\ 0.615444444 & 0.716555556 \end{bmatrix}\)

step3 求协方差矩阵的特征值和特征向量

由于协方差矩阵是对称矩阵,因此在数学计算上更加方便。关于矩阵如何求特征值和特征向量,下次再写一篇相关的文章。这里假设我们已经求出了特征值和特征向量:

\[
eigenvalues=\left( \begin{matrix} 0.490833989 \\ 1.28402771 \end{matrix} \right)
\]

\[
eigenvectors=\left( \begin{matrix} -0.735178656 & -0.677873399 \\ 0.677873399 & -0.735178656 \end{matrix} \right)
\]

上面是两个特征值,下面是对应的特征向量,特征值 0.0490833989 对应的特征向量为 \((-0.735178656, 0.677873399)^T\),这里的特征向量都为归一化后的向量。

step4 选取特征向量矩阵

将特征值按照从大到小的顺序排列,选择其中最大的 k 个,然后将其对应的 k 个特征向量分别作为列向量组成特征向量矩阵。由于这里特征值只有两个,我们选择较大的那个,也就是 1.28402771,得到的特征向量矩阵为:
\[
\begin{bmatrix} -0.677873399 \\ -0.735178656 \end{bmatrix}
\]

step5 将样本投影到特征矩阵上

假设样本数为 m,特征数为 n,归一化后的样本矩阵为 DataAdjust(m * n),协方差矩阵为 n * n,选取的 k 个特征向量组成的矩阵为 EigenVectors(n * k),则投影后得到的最终数据为:
FinalData(m * k) = DataAdjust(m * n) * EigenVectors(n * k)
在本例中,
\[
FinalData(m*k)=\begin{array}{c|lcr} x \\ \hline -0.82797 \\ 1.77758 \\ -0.992197494 \\ -0.27421 \\ -1.67580 \\ -0.91294 \\ 0.09910 \\ 1.14457 \\ 0.43804 \\ 1.22382 \\ \end{array}
\]
这样,我们就将原始的 n 维特征数据变成了 k 维(本例中,是 2 维到 1 维)。

总结

讲到这,「PCA」的流程就基本结束了。
不过,总结之前还有个细节要交代。虽然 step1 的时候我们已经对数据做了归一化,让数据的特征值都平移到原点附近,但对不同特征之间方差差异较大的问题仍然没解决(比如:样本第一个特征是汽车速度「0~100」,第二个特征是汽车座位数「2~6」,那么很明显,第一个特征的方差比第二个大很多)。不解决这个问题会有什么问题暂不清楚。消除这种差异的方法,除了减去均值外,还需要除以各自的标准差,流程归纳如下:

  1. Let \(\mu = \frac{1}{m} \sum_{i=1}^m{x^{(i)}}\)
  2. Replace each \(x^{(i)} \text{with} \ x^{(i)}-\mu\)
  3. Let \(\sigma_{j}^2 = \frac{1}{m} \sum_{i}{({x_{j}^{(i)}})^2}\)
  4. Replace each \(x_j^{(i)} \text{with} \ \frac{x_j^{(i)}}{\sigma_j}\)

(注:\(x^{(i)}\) 代指每个样例)

PCA的总体流程为:

  1. 样本归一化;
  2. 求样本特征的协方差矩阵;
  3. 选取k个最大的特征值;
  4. 组成特征向量矩阵;
  5. 将样本数据投影到特征向量矩阵上。

实际应用

在机器学习中,我们通过训练集计算出特征向量矩阵并降维,然后在降维后的训练集上进行训练。预测的时候,我们同样需要对测试集进行降维(要保证数据模型的统一),降维的方法是用训练集计算出来的特征向量矩阵与测试集的数据相乘,然后再对降维的测试数据进行预测评估。

参考

PCA算法浅析的更多相关文章

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

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

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

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

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

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

  4. 降维之pca算法

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

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

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

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

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

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

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

  8. PCA算法的最小平方误差解释

    PCA算法另外一种理解角度是:最小化点到投影后点的距离平方和. 假设我们有m个样本点,且都位于n维空间 中,而我们要把原n维空间中的样本点投影到k维子空间W中去(k<n),并使得这m个点到投影点 ...

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

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

随机推荐

  1. 创建免密码sudo用户

    创建免密码sudo用户 #!/bin/bash c1=`grep -w 'bkuser' /etc/passwd | wc -l` ]; then echo "bkuser已经存在" ...

  2. 信用评分卡Credit Scorecards (1-7)

      欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 python风控评分卡建模和风控常识 https://study.163.com/course/introductio ...

  3. MyBatis-DynamicSQL IF判断

    在写动态sql时发现字符串的判断没有生效 <if test="CLLX != null and CLLX != ''"> and a.CLLX = #{CLLX} &l ...

  4. 在Ajax返回多个值

    <html> <head> <title>AjaxTest</title> <script type="text/javascript& ...

  5. SQLyog远程连接腾讯云服务器数据库Mysql遇到的坑

    首先说明我的数据库是安装在云服务器上,不是专业的数据库服务器,没错就是10块钱包月的. 然后觉得使用SQLyog远程维护数据库比较方面,可是怎么都登录不上去. 下面分析原因: 1.安全组是否放过了访问 ...

  6. jQuery视频格式的验证

    $(document).on('change','#videofile',function() { var file = this.files[0]; if (!/video\/\w+/.test(f ...

  7. mysql修改表结构语句

    mysql alter 用法,修改表,字段等信息   一: 修改表信息 1.修改表名 alter table test_a rename to sys_app; 2.修改表注释 alter table ...

  8. 【转载】详解KMP算法

    网址:https://www.cnblogs.com/yjiyjige/p/3263858.html

  9. 12.scrapy框架

    一.Scrapy 框架简介 1.简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个 ...

  10. 数据库设计理论与实践·<一>总结

    一.数据库生命周期 数据库生命周期流程图如下: 二.各阶段附图 附图1.1 数据流图 附图1.2 数据字典-方式1 补充说明:数据字典既可以单张表格表示,也可以多种(数据项表/数据结构表/数据流表/外 ...