源自知乎的一个答案,网上很多关于PCA的文章,不过很多都只讲到了如何理解方差的投影,却很少有讲到为什么特征向量就是投影方向。本文从形象角度谈一谈,因为没有证明,所以不会严谨,但是应该能够帮助形象理解PCA背后的原理。

一、先从旋转和缩放角度,理解一下特征向量和特征值的几何意义

从定义来理解特征向量的话,就是经过一个矩阵变换后,空间沿着特征向量的方向上相当于只发生了缩放,比如我们考虑下面的矩阵:

\[
\begin{bmatrix}
1.5 & 0.5\\
0.5 & 1.0
\end{bmatrix}
\]

求这个变换的特征向量和特征值,分别是:\(U=\begin{bmatrix} 0.85 & -0.53\\ 0.53 & 0.85 \end{bmatrix}\)(列向量)和1.81,0.69

用一个形象的例子来说明一下几何意义,我们考虑下面笑脸图案:

为方便演示笑脸图案在0,0和1,1围起来的单位正方形里,同时也用两个箭头标出来了特征向量的方向。经过\(\begin{bmatrix} 1.5 & 0.5\\ 0.5 & 1.0 \end{bmatrix}\)变换,也就是用这个图案中的每个点的坐标和这个矩阵做乘法,得到下面图案:

可以看到就是沿着两个正交的,特征向量的方向进行了缩放,这就是特征向量的一般的几何理解。

这个理解虽然清晰,但是并没有特别形象。我们也可以分解一下,从旋转和沿轴缩放的角度理解,分成三步:

第一步,把特征向量所指的方向分别转到横轴和纵轴这一步相当于用U的转置,也就是\(U^{T}\)进行了变换

第二步,然后把特征值作为缩放倍数,构造一个缩放矩阵\(\begin{bmatrix} 1.81 & 0\\ 0 & 0.69 \end{bmatrix}\),矩阵分别沿着横轴和纵轴进行缩放:

第三步,很自然地,接下来只要把这个图案转回去,也就是直接乘U就可以了

所以,从旋转和缩放的角度,一个矩阵变换就是,旋转-->沿坐标轴缩放-->转回来,的三步操作,表达如下:

\[T=U \Sigma U ^{T}\]

多提一句,这里给的是个(半)正定矩阵的例子,对于不镇定的矩阵,也是可以分解为,旋转-->沿坐标轴缩放-->旋转,的三步的,只不过最后一步和第一步的两个旋转不是转回去的关系了,表达如下:

\[T=U \Sigma V^{T}\]

这个就是SVD分解,就不详细说了。另外,这个例子是二维的,高维类似,但是形象理解需要脑补。

二、协方差矩阵的特征向量PCA的意义

一句话概括PCA的话就是找到方差在该方向上投影最大的那些方向,比如下边这个图是用\(\begin{bmatrix} 1 & 0.5\\ 0.5 & 1 \end{bmatrix}\)作为些协方差矩阵产生的高斯分布样本:

大致用个椭圆圈出来分布,相关性最强的(0.707,0.707)方向就是投影之后方差最大的方向。接下来我们不尝试严格证明,而是从旋转和缩放的角度形象理解一下,我们可以考虑把这个分布也旋转一下,让长轴在x轴上,短轴在y轴上,变成如下:

然后再沿着x轴和y轴,除以标准差,缩放成标准差为1的单位分布:

注意,在这个除以标准差的过程中,标准差最大的轴,就对应着原空间中,样本投影后方差最大的方向。接下来,假设这个分布中的样本为\(X_U\),则我们可以把一开始的样本表示为:

\[X=ULX_U\]

用这么别扭的表示方式主要是为了接下来推公式方便,所以接下来推个简单的公式:

协方差矩阵,用S表示,则有

\[S_{ij}=E\left[ (X_i-\mu _i)(X_j-\mu _j) \right]\]

因为这个分布里两个维度的均值都是0,所以有

\[S_{ij}=E\left[ X_iX_j \right]\]

所以

\[S=\frac{1}{N} XX^T\]

其中N是样本数,根据前面的\(X=ULX_U\),进一步展开这个公式:

\[S=\frac{1}{N} XX^T=\frac{1}{N}(ULX_U)(ULX_U)^T=UL(\frac{1}{N}X_U{X_U}^T)L^TU^T\]

因为\(X_U\)是个单位方差的且无相关性的样本,所以

\[\frac{1}{N}X_U{X_U}^T=I\]

另外L是个对角矩阵所以有

\[S=ULL^TU^T=UL^2U^T=U\Sigma U^T\]

这个公式上一部分已经说过了。所以对角线上的元素对应的就是方差的大小,而缩放倍数就是标准差的大小,也就是特征值的开根号,而U就是要沿着缩放的方向,也就是问题中投影的方向,正是特征向量。

主成分分析(PCA)的一种直观理解的更多相关文章

  1. 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)

    目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...

  2. 运用sklearn进行主成分分析(PCA)代码实现

    基于sklearn的主成分分析代码实现 一.前言及回顾 二.sklearn的PCA类介绍 三.分类结果区域可视化函数 四.10行代码完成葡萄酒数据集分类 五.完整代码 六.总结 基于sklearn的主 ...

  3. SciKit-Learn 可视化数据:主成分分析(PCA)

    ## 保留版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Le ...

  4. 线性判别分析(LDA), 主成分分析(PCA)及其推导【转】

    前言: 如果学习分类算法,最好从线性的入手,线性分类器最简单的就是LDA,它可以看做是简化版的SVM,如果想理解SVM这种分类器,那理解LDA就是很有必要的了. 谈到LDA,就不得不谈谈PCA,PCA ...

  5. 机器学习中的数学-线性判别分析(LDA), 主成分分析(PCA)

    转:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html 版权声明: 本文由L ...

  6. 机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

  7. 机器学习 —— 基础整理(四)特征提取之线性方法:主成分分析PCA、独立成分分析ICA、线性判别分析LDA

    本文简单整理了以下内容: (一)维数灾难 (二)特征提取--线性方法 1. 主成分分析PCA 2. 独立成分分析ICA 3. 线性判别分析LDA (一)维数灾难(Curse of dimensiona ...

  8. 主成分分析(PCA)原理及推导

    原文:http://blog.csdn.net/zhongkejingwang/article/details/42264479 什么是PCA? 在数据挖掘或者图像处理等领域经常会用到主成分分析,这样 ...

  9. 主成分分析(PCA)

    相对与网上很多人分享的有关PCA的经历,我第一次接触PCA却不是从人脸表情识别开始的,但我所在的实验室方向之一是人脸的研究,最后也会回到这个方向上来吧. PCA(principal component ...

随机推荐

  1. Android Studio 无法启动模拟器的一种可能是你装的是Ghost版的系统

    我遇到的问题是,打开模拟器,进度条走到最后,突然出现了emulator error,然后模拟器就无法启动(不好意思当时没有截图).我是在Ghost版 win7系统下运行Android Studio 的 ...

  2. 如何查看Android的Keystore文件的SHA1值

    像使用百度地图api时候,一般需要获取keystore的SHA1值,这里就手把手教大家如何查看Android的keystore文件中的SHA1值. 第一步: 打开cmd,切换到keystore所在的文 ...

  3. phpmyadmin Wrong permissions on configuration file, should not be world writable!

    巴拉巴拉,实际场景是这样,因为有需要,所以想用django 做个rest服务给其他平台提供服务,发现以前正常的页面都无法运行,奇怪发现有一个页面提示连接不上mysql 难道mysql挂了,打开phpm ...

  4. iOS 视图,动画渲染机制探究

    腾讯Bugly特约作者:陈向文 终端的开发,首当其冲的就是视图.动画的渲染,切换等等.用户使用 App 时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅.UI就是 App 的门面,它的体验 ...

  5. 浅谈Excel开发:一 Excel 开发概述

        做Office相关的开发工作快一年多了,在这一年多里,在插件的开发中遇到了各种各样的问题和困难,还好同事们都很厉害,在和他们的交流讨论中学到了很多的知识.目前Office相关的开发资料是比较少 ...

  6. 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码【123和12345】那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出的电话号码(java实现)

    解题: 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码[123和12345]那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出 ...

  7. Linux head和tail命令

    200 ? "200px" : this.width)!important;} --> 介绍 head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录. ...

  8. vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化)

    环境准备 软件:vmware workstation 9.0    ubuntu-12.04.2-server-amd64(官方下载) 硬件:确认CPU支持虚拟化VM-T vmware设置 vmwar ...

  9. Nginx做前端Proxy时TIME_WAIT过多的问题

    我们的DSP系统目前基本非凌晨时段的QPS都在10W以上,我们使用Golang来处理这些HTTP请求,Web服务器的前端用Nginx来做负载均衡,通过Nginx的proxy_pass来与Golang交 ...

  10. easy-ui 小白进阶史(二):操作数据,easy-ui操作

    easy-ui的操作及交互: Html: @using LangBo.Facade; @using LangBo.DataDefine; @using System.Threading.Tasks; ...