PCA revisit
都知道PCA可以做降维,那它为什么可以降维,究竟是怎么降维的呢?
1. 为什么我们要降维?
我们的样本数据好好的,为什么要去做降维,第一个要想清楚这个问题。
- 也许你是要训练一个分类器,觉得当前特征维度的太高,想去除冗余的维度,选择有区分性的维度
- 也许你是觉得维度太高,导致系统速度慢,存储开销大
- 也许你是觉得数据里面有噪声,想去除噪声
总之很多原因导致我们要去做降维,但是有两个主要的因素,就是去除数据里的冗余和噪声。
2. PCA是怎么去做降维的,怎么去除冗余和噪声的?
PCA有一个假设,数据中越是有区分度的维度,他的方差越大,例如我们的信号本身。越是没有区分度的维度,方差越小能量越小,例如噪声;
另外,如果两个维度相关性很高,那么其中一个维度就是冗余的,对于学习分类器没有很大的帮助,例如一个大学生的成绩里面,他的线性代数的成绩,和他的矩阵分析的成绩这两个相关性就很高,分类器只需要其中的一个来判断这个学生是工科生还是文科生。
综合以上两点,我们降维之后的数据一定要每个维度的方差大,同时维度之间的相关性小。
如何描述方差和相关性,有一个东西可以同时描述他们两——协方差矩阵!
协方差矩阵是一个方阵,i,j列表示样本的第 i 维和第 j 维之间的相关性 ( i = j 时描述的是第 i 维的方差)。
因此,理想的协方差矩阵的对角线应该是很大的值,而非对角线的位置都接近于0,这样才能保证方差大,相关性小呀!
如果当前样本的协方差矩阵已经是对角矩阵了,那我们就不用做PCA降维了,因为他们的特性已经很好了!很不幸,我们的数据通常都不是那么好,协方差矩阵不是理想的样子,很可能相关性很大。那么很明确,我们要做的就是使得降维之后的数据协方差矩阵是对角矩阵。
那么就要做矩阵对角化呗,什么方法可以得到对角矩阵,这个就是特征值分解,
A = P * B * P(T) (1)
B就是对角化的矩阵,A是原协方差矩阵,而我们知道B对角线上都是特征值,P里面都是对应的特征向量。如果我们降维之后的协方差矩阵张成B这个样就好了!
说到这里,协方差矩阵的公式还没提呢。
C = S(T) * S / (m - 1); (2)
C是协方差矩阵, S是m * d的样本数据矩阵,代表我们有m个样本,每个样本的维度是d。
那么当前有
A = S(T) * S / (m - 1);(3)
我们想要的是
B = S’(T) * S’ / (m - 1);(4)
S’就是我们降维之后的样本数据。 我们把公式(1) A = P * B * P(T),变一个样子就是 P(T) * A * P = B; 结合式子(3),于是乎
B = P(T) * A * P = P(T) * S(T) * S * P / (m - 1) = (SP)(T) * (SP) / (m - 1);再结合式子(4)
SP不就是我们想要的降维之后的数据S'吗?这里,如果把P中的特征向量去掉几个特征值低的,那么不仅选出了方差大的数据,还去除了冗余。因此,PCA就达到了目的了。
3. 总结
所以降维的公式也出来了, S’ = S * P,P是特征值大的维度对应的特征向量。
这是今天看完PCA之后的一点小总结,关于如何做特征值分解,今天也看了许久,感觉要补充的矩阵只是还是很有一些的。
贴一下http://mathfaculty.fullerton.edu/mathews/n2003/QRMethodMod.html 提到的用QR method来做特征值分解的伪代码。
QR Algorithm. The pseudocode for the QR method is:
1. i = 0
2.
3. repeat
4. Factor
5. 
6. i = i+1
7. until convergence
迭代的方式用QR分解来求特征值。这都是题外话了!
总之,我们需要理解PCA为什么能用协方差矩阵做特征值分解来求解,为什么这样做降维的结果就是好的结果,认真理解了才能更有效地使用它 。
PCA revisit的更多相关文章
- 用scikit-learn学习主成分分析(PCA)
在主成分分析(PCA)原理总结中,我们对主成分分析(以下简称PCA)的原理做了总结,下面我们就总结下如何使用scikit-learn工具来进行PCA降维. 1. scikit-learn PCA类介绍 ...
- 主成分分析(PCA)原理总结
主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...
- 机器学习基础与实践(三)----数据降维之PCA
写在前面:本来这篇应该是上周四更新,但是上周四写了一篇深度学习的反向传播法的过程,就推迟更新了.本来想参考PRML来写,但是发现里面涉及到比较多的数学知识,写出来可能不好理解,我决定还是用最通俗的方法 ...
- 数据降维技术(1)—PCA的数据原理
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...
- 深度学习笔记——PCA原理与数学推倒详解
PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多, ...
- PCA、ZCA白化
白化是一种重要的预处理过程,其目的就是降低输入数据的冗余性,使得经过白化处理的输入数据具有如下性质:(i)特征之间相关性较低:(ii)所有特征具有相同的方差. 白化又分为PCA白化和ZCA白化,在数据 ...
- PCA 协方差矩阵特征向量的计算
人脸识别中矩阵的维数n>>样本个数m. 计算矩阵A的主成分,根据PCA的原理,就是计算A的协方差矩阵A'A的特征值和特征向量,但是A'A有可能比较大,所以根据A'A的大小,可以计算AA'或 ...
- 【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
[引言]--PCA降维的作用 面对海量的.多维(可能有成百上千维)的数据,我们应该如何高效去除某些维度间相关的信息,保留对我们"有用"的信息,这是个问题. PCA给出了我们一种解决 ...
- 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)
Introduction 主成分分析(Principal Components Analysis)是一种对特征进行降维的方法.由于观测指标间存在相关性,将导致信息的重叠与低效,我们倾向于用少量的.尽可 ...
随机推荐
- FreeBSD虚拟机——小折腾
最近,突然想起来Linux了,因为前段时间接触了DOS命令,提高了自己的工作效率,这会想再温习下Linux的CLI,无奈windows下unix命令,水土不服,因此想尝试虚拟机,虚拟机软件无非vmwa ...
- Java Web学习总结(9)学习总结-JSTL
一,JSTL概述 JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能.jstl出现的目的同el一样也是要代替jsp页 ...
- h5视频做背景的样式
video{ position: fixed; display: block; width: 100%; object-fit:fill; height:100%; right: 0px; botto ...
- supermarket
题目链接 题意:给你n个商品,商品的利润和商品的过期时间,商品必须在过期时间内卖才能算利润,每天只能卖一件商品,问利润最大值. 思路:用并查集+贪心的思路,先给商品从大到小排序,然后选择过期时间的根节 ...
- TP中如何用IF
将TP中这个容易忘的知识点记下来以便日后翻阅 $memberField = "ID, NAME, MOBILE, MEMBER_STATUS as status, IF (MEMBER_ST ...
- BUUCTF | 高明的黑客
这一题一开始我没有理解"www.tar.gz"的涵义,还以为有一个其他的网站叫这个,后来才突然顿悟他也有可能是一个目录!!!地址栏输入”/www.tar.gz“ 然后就可以得到源码 ...
- Redis集群的搭建【转】
redis集群的特点: 1.机器多,能够保证redis服务器出现问题后,影响较小 2.自备主从结构,自动的根据算法划分主从结构.动态的实现 3.能够根据主从结构自动的实现高可用 4.实现数据文件的备份 ...
- JDK1.8 动态代理机制及源码解析
动态代理 a) jdk 动态代理 Proxy, 核心思想:通过实现被代理类的所有接口,生成一个字节码文件后构造一个代理对象,通过持有反射构造被代理类的一个实例,再通过invoke反射调用被代理类实例的 ...
- openoffice+pdf2swf+FlexPaper在线显示office和pdf
前提:本人的系统为Ubuntu 13.10 64位系统.本篇是我在配置好环境后一段时间写的,所以操作上可能会有也错误,因此仅供参考. 搜索在线显示office和pdf,最常见的方法就是把都转为swf, ...
- 浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)(转)
引子 STM32的硬件I2C很多人都对它望而却步.因为很多电工都说,STM32 硬件 I2C有BUG.不稳定.死机等等……最后都使用GPIO模拟I2C. 的确,模拟I2C好用.但是在我看来在一个72M ...