特征脸(Eigenface)理论基础之PCA主成分分析法


Posted in Python onMarch 13, 2018

在之前的博客 人脸识别经典算法一:特征脸方法(Eigenface)里面介绍了特征脸方法的原理,但是并没有对它用到的理论基础PCA做介绍,现在做补充。请将这两篇博文结合起来阅读。以下内容大部分参考自斯坦福机器学习课程:http://cs229.stanford.edu/materials.html

假设我们有一个关于机动车属性的数据集{x(i);i=1,...,m}(m代表机动车的属性个数),例如最大速度,最大转弯半径等。假设x(i)本质上是n维的空间的一个元素,其中n<<m,但是n对我们来说是未知的。假设xi和xj分别代表车以英里和公里为单位的最大速度。显然这两个属性是冗余的,因为它们两个是有线性关系而且可以相互转化的。因此如果仅以xi和xj来考虑的话,这个数据集是属于m-1维而不是m维空间的,所以n=m-1。推广之,我们该用什么方法降低数据冗余性呢?

首先考虑一个例子,假设有一份对遥控直升机操作员的调查,用x(i)1(1是下标,原谅我这操蛋的排版吧)表示飞行员i的飞行技能,x(i)2表示飞行员i喜欢飞行的程度。通常遥控直升飞机是很难操作的,只有那些非常坚持而且真正喜欢驾驶的人才能熟练操作。所以这两个属性x(i)1和x(i)2相关性是非常强的。我们可以假设两者的关系是按正比关系变化的,如下图里的u1所示,数据散布在u1两侧是因为有少许噪声。

特征脸(Eigenface)理论基础之PCA主成分分析法

接下来就是如何计算u1的方向了。首先我们需要预处理数据。

1.令特征脸(Eigenface)理论基础之PCA主成分分析法

2.用x(i)-μ替代x(i)

3.求特征脸(Eigenface)理论基础之PCA主成分分析法

4.用x(i)j/σj替代x(i)j

步骤1-2其实是将数据集的均值归零,也就是只取数据的偏差部分,对于本身均值为零的数据可以忽略这两步。步骤3-4是按照每个属性的方差将数据重新度量,也可以理解为归一化。因为对于不同的属性(比如车的速度和车座数目)如果不归一化是不具有比较性的,两者不在一个量级上。如果将pca应用到图像上的话是不需要步骤3-4的,因为每个像素(相当于不同的属性)的取值范围都是一样的。

数据经过如上处理之后,接下来就是寻找数据大致的走向了。一种方法是找到一个单位向量u,使所有数据在u上的投影之和最大,当然数据并不是严格按照u的方向分布的,而是分布在其周围。考虑下图的数据分布(这些数据已经做了前期的预处理)。

特征脸(Eigenface)理论基础之PCA主成分分析法

下图中,星号代表数据,原点代表数据在单位向量u上的投影(|x||u|cosΘ)

特征脸(Eigenface)理论基础之PCA主成分分析法

从上图可以看到,投影得到的数据仍然有很大的方差,而且投影点离原点很远。如果采取与上图u垂直的方向,则可以得到下图:

特征脸(Eigenface)理论基础之PCA主成分分析法

这里得到的投影方差比较小,而且离原点也更近。

上述u的方向只是感性的选择出来的,为了将选择u的步骤正式确定下来,可以假定在给定单位向量u和数据点x的情况下,投影的长度是xTu。举个例子,如果x(i)是数据集中的一个点(上图中的一个星号),那它在u上的投影xTu就是圆点到原点的距离(是标量哦)。所以,为了最大化投影的方差,我们需要选择一个单位向量u来最大化下式:

特征脸(Eigenface)理论基础之PCA主成分分析法

明显,按照||u||2=1(确保u是单位向量)来最大化上式就是求特征脸(Eigenface)理论基础之PCA主成分分析法的主特征向量。而特征脸(Eigenface)理论基础之PCA主成分分析法其实是数据集的协方差矩阵。

做个总结,如果我们要找数据集分布的一维子空间(就是将m维的数据用一维数据来表示),我们要选择协方差矩阵的主特征向量。推广之,如果要找k维的子空间,那就应该选择协方差矩阵的k个特征向量u1,u2,...,uk。ui(i=1,2,...,k)就是用来表征数据集的新坐标系。

为了在u1,u2,...,uk的基础上表示x(i),我们只需要计算

特征脸(Eigenface)理论基础之PCA主成分分析法

其中x(i)是属于n维空间的向量,而y(i)给出了基于k维空间的表示。因此说,PCA是一个数据降维算法。u1,u2,...,uk称为数据的k个主成分。

介绍到这里,还需要注意一些为题:

1、为什么u要选择单位向量

选择单位向量是为了统一表示数据,不选成单位的也可以,但各个向量长度必须统一,比如统一长度为2、3等等。

2、各个u要相互正交

如果u不正交,那么在各个u上的投影将含有冗余成分

2、为什么要最大化投影的方差

举个例子,如果在某个u上的投影方差为0,那这个u显然无法表示原数据,降维就没有意义了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python将多个文本文件合并为一个文本的代码(便于搜索)
Mar 13 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
Python字符串的全排列算法实例详解
Jan 07 Python
Python设计模式之外观模式实例详解
Jan 17 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
python Celery定时任务的示例
Mar 13 #Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 #Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 #Python
Python+Django搭建自己的blog网站
Mar 13 #Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 #Python
tensorflow实现softma识别MNIST
Mar 12 #Python
wxpython实现图书管理系统
Mar 12 #Python
You might like
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
php发送与接收流文件的方法
2015/02/11 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
JavaScript 题型问答有答案参考
2010/02/17 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
Django学习之文件上传与下载
2019/10/06 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
Django视图、传参和forms验证操作
2020/07/15 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
AJAX都有哪些有点和缺点
2012/11/03 面试题
中专毕业生的自我鉴定
2013/12/01 职场文书
承办会议欢迎词
2014/01/17 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
遗失证明范文
2015/06/19 职场文书
Python实现视频中添加音频工具详解
2021/12/06 Python
python字符串的一些常见实用操作
2022/04/06 Python