写在前面:

       前两周刚好翻到自己的毕业论文,看到之前做过的关于PCA点云法向量估计的推导.发现有些概念已经有些模糊不清了,正好遇到要进行组内分享,于是又重新查找资料对PCA再做了一次探索.

       当你去探究每一个陌生概念或者算法的时候,都会经历从混乱,到初见门道,到茅塞顿开的一个过程.混乱是痛苦的,混乱时候的痛苦和你茅塞顿开时获得的成就感是成正比的. 这篇文章我会从我的角度去记录这个过程.如果你还不了解PCA,希望通过这篇文章也能让你茅塞顿开,如果你已经很熟悉PCA,那希望你可以在这篇文章中再一次感受PCA之美.

前言:

这篇文章会大体分三个部分进行叙述,第一节什么是PCA,对PCA做一个大体的介绍,配合一个直观的例子,带大家感受一下整个PCA的过程。第二节,PCA原理,根据我自己的体会,跟大家做一些PCA大致的推导。第三节,PCA应用,根据一些例子,做一些PCA应用的分析。第四节,简单的说一下PCA和Autoencoder的关系。在这里shout out to leemeng. 这篇文章中的很多动画出自他手,在文章最后我会贴出他的博客地址。

一.什么是PCA

PCA 全名 Principal components analysis。翻译过来就是主成分分析,显而易见,这就是一种用来分析主要成分的方法。用稍微专业一点的话来说:在机器学习领域,PCA是一种被广泛用于数据线性降维(Dimension reduction)和特征提取(Feature extraction)的方法(这里的线性划重点,会在第四节具体说到)。

在机器学习中主要希望用PCA达到dimension reduction的目的,主要是为了避免Hughes Phenomenon 和 curse of dimensionality。这边先简单的复习一下维度诅咒,预测和分类的能力通常是随着数据维度数的增加而上升,但当模型样本数没有继续增加的情况下,预测和分类能力达到一定程度之后,预测和分类能力反而会随着数据维度的增加而减小。同时对于很多的数据进行降维还有利于加速,保证降维后各个维度之间的数据独立性最高即方差最大。但是PCA的缺点在于,进行降维后的数据是不可解释的,但大部分时候我们是不在意的。因为这个特点,PCA还常常用于训练数据集的加密。比如你想把你收集的数据集分享给大家,但是不想让大家用你的数据集做其他用途,就可以直接放出经过降维的数据。

在继续阅读下面部分之前,有必要跟大家说明本文后面设计的线性代数知识。

Linear Combination(线性组合)

Linear Transformation(线性变换)

Dot Product(点积)

Change of Basis(基底变换)

Eigenvalue Eigenvalue(特征值与特征向量)

当然如果你不熟悉也没关系,在这篇文章我会尽可能用通俗易懂的语言去让你感受PCA,你可以稍后在去理解这些知识。当然,这边更推荐你快速的观看3Blue1Brown的线性代数的本质,帮助你快速的复习。

现在我就用一个简单的例子,假设你收集了一组二维数据如下。现在看看这组数据,相信根据你的几何直觉,你能感觉到,你可能能使用一条直线去表示这组数据。

果然,根据下面的视频你可以发现,我们做了一个将这组二维数据映射到向量v的一个操作。每一个数据,我们都把他用一个值来表示,这就是最简单的一个PCA的过程,把一个组二维的数据,变换成了一维。

v这个向量是如何找到的呢?为什么说v这个向量能保存这组数据最大的特征呢?

二.原理推导

我们上面已经说过,我们PCA想要得到结果是降维后的数据能够保证数据最多的信息,并且能够使降维后的数据之间的相关性降到最低。所以就牵扯到了我们下面要讲的概念去相关(Decorrelation)。所以其实一个PCA过程也可以说分成了两部分,去相关和线性映射。

1.Decorrelation

说到相关性,相信大家都能在自然而然的想到一个东西,协方差(covariance),我们现在来简单的复习一下协方差的意义。

可能有些朋友还知道协方差的另一个名字,共变异数,简单的解释:当cov大于0的时候表示两特征的变化有相同的倾向。cov等于0的时候表示两个特征的变化没有明显的关系,cov小于0的时候表示两特征的变化具有相反的倾向。下面这个动图你可以直观的感受一下协方差的计算过程。这里有一个要注意的是,不知道大家能不能发现这组数据其实已经经过了正规化处理,其具体的意义我在这里就不做赘述。

现在我们去相关要达到的目标是通过某种操作,让两个特征的相关性为0,即他们的协方差为0。实现这个目的,我们需要知道基底变换这个概念,下面这个动图表示了基底变换是如何影响数据的协方差的。

这时候我们如何找到pc1和pc2这个新的基底呢?这时候我们就需要引入下一个重要的概念,协方差矩阵。

协方差矩阵:协方差矩阵是一个n*n维的方阵,协方差矩阵的元素值代表了样本集在对应方向上的方差,也就是说每一个值代表了某两个特征之间的

我们的目的是要将样本之间的协方差都变成0,这时候大家有没有一点感觉,当一个矩阵除了对角线上其他位置的值都为0的时候我们叫他对角矩阵。我们现在就要想办法把这个协方差矩阵变成一个对角矩阵。熟悉线性的代数的朋友应该知道下面要说的方法。叫做奇异值分解,当你需要分解的矩阵是个方阵的时候,这个方法又可以叫做特征值分解。

对角线上的值即为一个个特征向量,Q即为一组正交的基底。我们通过Q的转置对原数据样本进行线性变换,就是做了基底变换的操作,显而易见,经过基底变换,我们把这组数据的协方差变成了0。

其中特征值越大,表示在这个方向上数据的方差越大。这一点需要使用拉格朗日乘子进行证明,在下一节的利用PCA进行点云法向量估计中你也可以体会这个过程,在这里不久不做详细的证明,感兴趣的可以在mathematics for machine learning这本书的chapter10中做进一步了解。

2.Reconstruction Error

      我们在前面提到过,我们要保证降维之后的数据能保存尽可能多的数据的价值。这时候我们就需要引入Reconstruction Error这个概念了,这个概念也是后面会说的autoencoder的关键。

其中的T就对应的把数据从二维投影到一维的投影矩阵。通过下面这个动图,大家可以感受一下整个RE的变换。也可以大致理解pc1和pc2的区别。

下面分享一些更多的对于协方差矩阵的理解。

协方差矩阵C的对角线上的元素C(i,i)代表了样本集在第i个维度上的方差,也即代表样本集在第i个维度上的能量。C(i,j)代表了样本集在第i个维度和第j个维度上的样本分量之间的协方差,可以理解为样本集在第i维投影方向和第j维投影方向之间的斜线方向上的方差,或者能量。所以,协方差矩阵集中表示了样本集在原n维空间中各个方向上的能量分布。

通过对协方差矩阵求特征向量,实际上找到的是在原n维空间中的一些特定的方向,样本集的能量集中分布在这些方向上,而特征值的大小就反映了样本集在该方向上的能量大小。PCA正式基于这一点,删掉对应特征值小的方向,只保留主要的方向,达到降维的目的。

三.一些应用

1.PCA点云法向量估计

我本人主要的方向是三维计算机视觉,最初接触到PCA也是因为做点云法向量估计。如果对这个不熟悉的同学可以跳过这一节。

对于点云中每个点的法向量属性的定义是垂直于其所在平面的向量,即采用当前点的邻近点,拟合出一个局部平面,进行法向量求解。基于主成分分析方法的法向量估计实际上是从最小二乘法推导出来的。

对于邻近点的查找,采用以当前为球心做半径为0.05的球,球内的点为该点的邻近点。找到一个平面,使得以上选出的点到这个平面的距离最小。假设这个平面的中心点为 c , 穿过中心点的法向量为 n, 那么点 xi 到平面的距离 d ,可以看作是向量 xi-c 在法线方向上投影向量的长度,根据以上原理我们可以列出目标函数式:

通常情况下,我们可以把点c看作空间中所有点的中心,这一步实际上就是在做数据中心化。

根据上面两个式子对我们的目标函数进行代入。

对上面的式子进行展开化简。

显而易见,大家可以自己去找一些数据在本子上画一画,S即是一个协方差矩阵,同样的对其进行特征值分解,这时由于我们的目标是最小化f(n),所以这时我们选取最小特征值对应的特征向量,即是我们需要的法向量。其中的原理就是简单的矩阵运算。再多想一点,其实我们做法向量估计其实就是在做平面拟合,也就是将三维的点云数据降到二维,而这里为什么选取特征值最小特征向量刚好是因为特征值越小,那么就越能表现这些数据的共性

2.In machine learning

这边有一些scikit-learn中提供的数据,上面也附有代码和数据,大家亲自去运行一下,就会对PCA的应用有着更深刻的理解。后面有机会,会挑一个例子做一些详细的分析。

The Iris DataSet

The Olivetti Faces

Handwritten Digits

四.From PCA to Autoencoder

如果你读懂了前面的文章,那么可以知道,在上面讲的PCA的所有过程中,我们所做的都是线性变换,做的线性降维。

在进行深度学习研究,特别是计算机视觉领域的深度学习时,我们常常面对的数据是图片,一张800*800的RGB图片就有1920000维的特征,对于这样的大量特征,PCA速度慢的缺点就会暴露的很明显。那既然是深度学习,那我们能不能通过一个网络来做PCA呢?答案当然是可以的。还记得我们前面说的Reconstruction Error吗?通过这个Reconstruction Error我们便可以设计一个简单的网络:

其中的Encoder可以理解为我们前面提到的投影矩阵,其中的Decoder可以理解为投影矩阵的转置。除了速度快,Autoencoder还有一个更好的地方就是,如果我们在网络中引入非线性层,那它就变成了一个非线性的降维方法。

总的来说,Autoencoder就是一个更加高效,更加灵活,更加powerful的”PCA“(这就是深度学习的魅力吗?OvO)。这边建议大家去看Geoffrey Hinton的Neural Networks for Machine Learning中的Lecture 15 From PCA to Autoencoder。

Reference

世上最生动的PCA (动画资源的来源)

A One-Stop Shop for Principal Component Analysis  (更多从datascience角度讲解)

Mathematics for machine learning chapter 15 (正如书名 非常的mathematical)

感受PCA之美(Principal components analysis overview and application)相关推荐

  1. OpenCV3.3中主成分分析(Principal Components Analysis, PCA)接口简介及使用

    OpenCV3.3中给出了主成分分析(Principal Components Analysis, PCA)的实现,即cv::PCA类,类的声明在include/opencv2/core.hpp文件中 ...

  2. Jordan Lecture Note-9: Principal Components Analysis (PCA).

    Jordan Lecture Note-9: Principal Components Analysis (PCA). Principal Components Analysis (一)引入PCA   ...

  3. A tutorial on Principal Components Analysis - 主成分分析(PCA)教程

    A tutorial on Principal Components Analysis 原著:Lindsay I Smith, A tutorial on Principal Components A ...

  4. PCA(Principal Components Analysis)

    文章目录 一.定义符号 二.中心化和标准化 三.Z-score 标准化 四.PCA 算法的基本思想 五.求解 μ 与降维 六.参考 资料领取 | 干货分享 | 欢迎来访 >>>> ...

  5. 学习,使用主成分分析 (Principal components analysis,PCA)处理数据必看文章

    强烈推荐如下高质量博文: https://blog.csdn.net/watkinsong/article/details/8234766#commentsedit 我的pca迷惑 迷惑一 刚开始接触 ...

  6. PCA(主成分分析-principal components analysis)学习笔记以及源代码实战讲解

    PCA(主成分分析-principal components analysis)学习笔记以及源代码实战讲解 文章目录 PCA(主成分分析-principal components analysis)学 ...

  7. A tutorial on Principal Components Analysis | 主成分分析(PCA)教程

    A tutorial on Principal Components Analysis 原著:Lindsay I Smith, A tutorial on Principal Components A ...

  8. 主成分分析(PCA)(principal component analysis)

    本文主要讲PCA的相关数学推导.PCA的数学推导用线性代数的知识就可以完成. 参考deeplearningbook.org一书2.12 Example: Principal Components An ...

  9. 主成分分析(Principal components analysis)-最大方差解释(转)

    在这一篇之前的内容是<Factor Analysis>,由于非常理论,打算学完整个课程后再写.在写这篇之前,我阅读了PCA.SVD和LDA.这几个模型相近,却都有自己的特点.本篇打算先介绍 ...

最新文章

  1. Linux futex 快速同步互斥机制简介
  2. mac删除ssh key_SecureCRT for mac(好用的终端SSH仿真工具)
  3. 适合初学者的安卓开源项目_开源系列的初学者将从下周开始
  4. SQLite和NPoco的数据库初始化器
  5. 加密托管机构Komainu与英国当局合作存储没收的加密货币
  6. Springboot集成JavaMailSender发送邮件
  7. https默认端口_Java企业信息化平台O2OA如何配置服务器来启用HTTPS(SSL)
  8. 乱码(四): 撬动地球的支点
  9. 六级核心词汇201~250
  10. 河海大学计算机科学学科,2020河海大学计算机考研专业课调整
  11. Netty和Tomcat有什么区别
  12. 用Affinity画对称纹理
  13. 如何在linux系统下的抓包文件保存在u盘里,在xp系统中打开,【Linux】Wireshark在Linux系统下的安装及使用...
  14. Adobe相关(Windows平台)
  15. Android手机拍照功能的实现
  16. 模拟电路 二极管门电路(二)
  17. openmv一些常见问题与心得总结
  18. 使用 jquery.wordexport.js导出的Word排版
  19. git switch 与 git checkout的不同
  20. Cisco AP 升级

热门文章

  1. [PTA]实验7-3-5 输出大写英文字母
  2. excel自定义格式根据输入的数值显示整数和小数
  3. css :not(否定伪类)用法
  4. VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tupl
  5. MSA/MSB定位流程
  6. 关于if-else配对的就近原则问题(适合初学者)
  7. nmap(扫描端口工具)安装教程
  8. for...in...和for...of...的区别是什么
  9. 小剂量泼尼松治疗亚急性甲状腺炎的临床研究
  10. uniCloud云函数操作云数据库增删改查