很久以前写过一篇 PCA 的小白教程,不过由于当时对 PCA 的理解流于表面,所以只是介绍了一下 PCA 的算法流程。今天在数图课上偶然听到 PCA 在图像压缩上的应用,突然明白了一点实质性的东西,这里趁热记录一波。

PCA 算法

首先还是简单回顾下 PCA 的算法流程。

我们把样本数据 \(x\) 归一化后,计算其协方差矩阵 \(C_x\),然后计算 \(C_x\) 的特征向量,构造出一个特征向量矩阵 \(A\),最后把 \(x\) 通过该矩阵映射到一个新的空间,得到的向量 \(y\) 就是能体现 \(x\) 主要成分的向量了。

PCA 在做什么

那么,这种空间映射有什么意义呢?问题要回到协方差矩阵 \(C_x\) 上。我们知道,协方差矩阵是一个对称矩阵,在线性代数中,对称矩阵的特征向量是相互正交的。而我们把 \(x\) 通过这个特征向量矩阵映射到 \(y\),其实就是把原来的数据由最初的 \([e_1, e_2, \dots, e_n]\) 的单位坐标系,调整到这些正交的特征向量组成的坐标系下,如下图所示:

这种坐标变换的意义又在哪呢?

如果仔细分析,我们就会发现,这些新得到的向量 \(y\) 的均值为 \(0\),而且它们的协方差矩阵为:
\[
C_y=AC_xA^T=\begin{bmatrix} \lambda_1 & & & 0 \\ & \lambda_2 & & \\ & & \ddots & \\ 0 & & & \lambda_n \end{bmatrix}
\]
这里,\(A\) 是由 \(C_x\) 的特征向量组成的矩阵,它的第一行表示最大特征值对应的特征向量,第二行表示第二大特征值对应的特征向量。\(C_y\) 对角线上的 \(\lambda_k\) 代表 \(C_x\) 的特征值,而且是按照从大到小排序的(\(\lambda_1 > \lambda_2 > \dots > \lambda_n\))。

这个新的协方差矩阵有一个很重要的性质,除了对角线上的元素,其他元素通通是 0。要知道,协方差矩阵中,对角线上的元素表示方差,非对角线上的元素表示协方差。这说明,经过 PCA 处理后,我们把原本的数据 \(x\),转变成各个分量之间没有任何关系(协方差为 0)的数据 \(y\)!我认为这正是 PCA 的精髓所在,也是我们使用 PCA 算法的根本目标。

另外,PCA 还经常用于降维处理,那么为什么 PCA 的降维效果会那么好?

首先要明确一点,降维不是随便都能降的,最好的降维方法是要尽量保留重要的信息,而忽略次要的信息。在 PCA 中,我们一般是对协方差矩阵的特征值按从大到小排序,然后舍弃一些比较小的特征值(以及这些特征值对应的特征向量),这样重新计算得到 \(y\) 后,它的协方差矩阵可能是这个样子的:
\[
C_y=\begin{bmatrix} \lambda_1 & & & 0 \\ & \lambda_2 & & \\ & & \ddots & \\ 0 & & & \lambda_k \end{bmatrix}
\]
(我们舍弃掉了 \(n-k\) 个特征向量,将数据由 \(n\) 维降到 \(k\) 维)

要知道,这些特征值(或者说方差)都是按照从大到小排序的,也就是说,我们在降维时,舍弃掉了那些特征值比较小的分量。这么做是符合常理的,因为数据的方差越大,证明分布越广,这样,我们还原这些数据的难度是越大的,而方差越小,证明数据分布越集中,还原它们的难度就越小(方差为 0 的话,用一个数就可以代表所有样本了)。所以,降维时,我们尽量保留那些方差大的数据,而忽略那些方差小的。本文开篇的图中给出一个形象的解释,我们把一个二维的数据映射到一维时,也是优先映射到方差大的那一维上,这样,原数据的分布规律可以最大限度的保留下来,信息的保留也是最完整的。

PCA,到底在做什么的更多相关文章

  1. Android Intent到底能做些什么

    Android Intent到底能做些什么 原文:http://www.toutiao.com/i6348296465147757058/?tt_from=mobile_qq&utm_camp ...

  2. java突破------一撸到底(做Java开发,遇到瓶颈是保持现状还是寻求突破?)

    java突破------一撸到底(做Java开发,遇到瓶颈是保持现状还是寻求突破?) 很多人做Java开发2.3年之后,都会觉得自己遇到了瓶颈.什么都会又什么都不会,如何改变困境,为什么很多人写了7. ...

  3. ERP系统到底能做什么?

    ERP的定义:在先进的企业管理思想的基础上,应用信息技术实现对整个企业资源的一体化管理. 关键词:信息技术 先进的管理思想 企业资源一体化: 那么,ERP系统在企业日常经营管理中到底能做什么? 1.在 ...

  4. 7.学完linux系统运维到底可以做什么?

    linux运维到底可以做什么?(略有改动原文.排版) 运维,很容易从字面理解为运营.维护. 很多朋友认为,在互联网公司中linux系统运维的工作就是安装系统,部署服务.处理紧急故障,为公司里的开发人员 ...

  5. HashMap的初始化,到底都做了什么?

    HashMap的初始化,到底都做了什么? HashMap初始化参数都是什么?默认是多少? 为什么建议初始化设置容量? tableSizeFor方法是做什么的? 如何获取到一个key的hash值?及计算 ...

  6. 学了 C 语言到底能做什么, 能从事什么工作?

    前言 经常有小伙伴问我,你是做C/C++的,那学C语言可以做什么呢?尤其是还在学校的同学,感觉自己学了很久,什么也做不了,一度怀疑自己是不是不适合程序员这个方向. 开始我都是直接说可以开发嵌入式啊,做 ...

  7. 搞懂ZooKeeper到底是做啥的

    一.ZooKeeper是啥 ZooKeeper概念 ZooKeeper是一个开源的分布式协调服务(a service for coordinating processes of distributed ...

  8. session的到底是做什么的?

    原文地址:https://blog.csdn.net/h19910518/article/details/79348051 前言: 今天就来彻底的学一些session是个啥东西,我罗列了几个需要知道的 ...

  9. BPM到底能做什么?K2为你解读

    和平镇,镇如其名,几百年来一直很和平,夜不闭户路不拾遗.可是这一年来,镇上金光寺的和尚却开始不断离奇死亡…… 衙门里新调来的李捕头正好负责这个案子,经过了几个月的不眠不休,现场侦查和缜密推理之后,一切 ...

随机推荐

  1. java如何获取一个对象的大小【转】

    When---什么时候需要知道对象的内存大小 在内存足够用的情况下我们是不需要考虑java中一个对象所占内存大小的.但当一个系统的内存有限,或者某块程序代码允许使用的内存大小有限制,又或者设计一个缓存 ...

  2. SQLserver查询库中包含某个字段的表

    select [name] from [TPMS_PRD].[dbo].sysobjects where id in(select id from [TPMS_PRD].[dbo].syscolumn ...

  3. 关于hibernate查询结果类的封装

    实际应用中,我们查询的结果有时候会需要其他的类或者是一个新的包装类,即希望映射到一个DTO(即使hibernate早在很久就不推荐使用..)但我还是说一下吧 如 我有这样子的两个类 //get和set ...

  4. Python Revisited Day 13 (正则表达式)

    目录 13.1 Python的正则表达式语言 13.1.1 字符与字符类 13.1.2 量词 {m, n} ? + * 组与捕获 ?:可以关闭捕获 断言与标记 13.2 正则表达式模块 正则表达式模块 ...

  5. (hdu 6024) Building Shops

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6024 Problem Description HDU’s n classrooms are on a ...

  6. python关于二分查找

    楔子 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72 ...

  7. jQuery 事件绑定

    在文档装载完成后,如果打算为元素绑定事件来完成某些操作,则可以使用 bind() 方法来对匹配元素进行特定事件的绑定,bind() 方法的调用格式为:bind( type [, data] , fn ...

  8. 一、Mysql安装

    一.官网下载:https://dev.mysql.com/downloads/mysql/ 二.解压下载好的压缩包,本人存放的位置如下: 如下图解压后的文件目录,因版本的差异.一开始解压后的文件夹下可 ...

  9. kettle基于时间戳增量更新

    思路1: 1.提前建好ts时间表,设置两个字段分别为current_t和load_t,current用于比较原表中日期的上限,load_t则为上次加载的日期,几位原表中日期的下限. create ta ...

  10. HP 1010、 1020、 1022 、M1005激光打印机内部无卡纸,但机器仍提示卡纸?

    HP 1010.1018.1020.1022.M1005激光打印机,硒鼓原装编号:Q2612A  1800页 ( A4纸,5%覆盖率).是办公桌面小型打印机中主流产品,故障率极小. 现有一台HP 10 ...