主成份分析(Principle Component Analysis)主要用来对数据进行降维。对于高维数据,处理起来比较麻烦,而且高维数据可能含有相关的维度,数据存在冗余,PCA通过把高维数据向低维映射的同时尽可能保留数据蕴含的信息,到达简化数据的目的。

假设原始数据表示为$\{{{x}_{1}},{{x}_{2}},\cdots ,{{x}_{n}}\}$共$n$个数据,${{x}_{i}}$是$d$维的,现在首先分析PCA如何将它映射到一维,再推广到多维。

为了将数据向一维映射,需要解决两个问题,一是向那个方向映射,而是确定方向后如何映射。我们倒着来,先考虑第二个问题,再来说第一个。

另外,使用PCA之前通常要对数据不同维度进行归一化,消除不同维度尺度的影响。

1、  对数据${{x}_{i}}$进行变换${{x}_{i}}^{\prime }={{x}_{i}}-m$ ,其中$m$ 为样本均值。这一步使得数据均值为$\vec{0}$ ;

2、  进一步变换${{x}_{i}}^{\prime \prime }={{{x}_{ij}}^{\prime }}/{{{\sigma }_{j}}}\;$ 其中${{\sigma }_{j}}$为数据第$j$ 维的标准差,这一步使得数据各个维度的标准差为1;

经过以上两步,样本不同维度的尺度对PCA的影响基本消除了。为何要消除不同维度影响,可以结合下文从样本方差的角度理解。(方差较低的维度会被方差较高的维度“掩盖”,但这并不能说明前者的含有信息也不如后者)。

下面所有的讨论将假设数据已经进行了归一化,均值$m=\vec{0}$,各个维度方差为1。如果没有归一化,并不影响推导结果,但推导过程稍微复杂一点点。

一、假定映射方向给定,如何映射?

向一维映射就是将原来的$d$维数据映射到一条直线上,现在假设直线的方向给定了,考虑如映射的问题,直观上将,我们首先想到是将原始数据向这个方向做垂直投影,下面将说明我们的直观感觉还是很有道理的。

以上两个图是两种不同的映射,第一个是垂直投影,第二个很奇葩,因为是我画的,但确实也是种映射好吗~哪种映射方式更好呢?这就要考虑PCA的目的了。PCA作用是通过降维来简化数据,但如果简化后的数据不能在后续分析中带来和原始数据近似的结果,那这种简化就是不可取的。所以,映射在降维要尽可能保留数据的内含信息,也就是说映射后的数据要和原始数据尽可能接近,所以可以采用最小误差作为映射的准则。

假设映射的方向表示为单位向量$e$,不失一般性,假设映射后的数据都落在了通过原点的直线上(如果该直线没有通过原点,平移一下就可以了,这并不影响直线上数据的相对位置,数据信息是等同的,直线的方向是关键,平移什么的无所谓~~大概就这个意思~~,另外在假设数据已经归一化的条件下,样本均值也在原点),那么映射后的数据可以表示为$\{{{\alpha }_{1}}e,{{\alpha }_{2}}e,\cdots ,{{\alpha }_{n}}e\}$ ,${{\alpha }_{i}}e$ 形式上仍然是$d$维的,但所有${{\alpha }_{i}}e$在一条直线上,所以映射后的数据实际上是一维的,这里仍写成$d$的表示是为了方便写出误差函数。给定了映射方向$e$,确定映射就是确定$\alpha {}_{i}$,所以误差函数写作\[\begin{align}J({{\alpha }_{1}},{{\alpha }_{2}},\cdots ,{{\alpha }_{3}})&=\sum\limits_{i=1}^{n}{{{\left\| {{\alpha }_{i}}e-{{x}_{i}} \right\|}^{2}}} \\& =\sum\limits_{i=1}^{n}{\alpha _{i}^{2}}-\sum\limits_{i=1}^{n}{2{{\alpha }_{i}}{{e}^{T}}{{x}_{i}}}+\sum\limits_{i=1}^{n}{x_{i}^{T}{{x}_{i}}} \\\end{align}\]

目的是要使得误差函数最小。这显然是关于${{\alpha }_{i}}$的凸函数,所以对${{\alpha }_{i}}$求偏导数,令其为0,可得到解\[\begin{align}{{\alpha }_{i}}={{e}^{T}}{{x}_{i}}\end{align}\]

这说明什么呢?这说明映射后的数据点正好是原始数据点向方向$e$的垂直投影。这就解决了给定方向后如何投影的问题——垂直投影,投影后原始数据${{x}_{i}}$表示为一维的数据${{\alpha }_{i}}$。

二、向哪个方向投影?

上文解决了给定方向$e$,如何映射数据的问题,现在从两个角度讨论如何确定$e$。

角度1:最小误差准则

仍然以最小误差(1)为准则来确定$e$,不同的是现在$e$是求解变量,${{\alpha }_{i}}$ 是(3)给定的确定值。重写误差函数为(2)为 \[\begin{align}J(e) &=\sum\limits_{i=1}^{n}{\alpha _{i}^{2}}-\sum\limits_{i=1}^{n}{2{{\alpha }_{i}}{{e}^{T}}{{x}_{i}}}+\sum\limits_{i=1}^{n}{x_{i}^{T}{{x}_{i}}} \notag\\& =\sum\limits_{i=1}^{n}{{{e}^{T}}{{x}_{i}}x_{i}^{T}e}-\sum\limits_{i=1}^{n}{2{{e}^{T}}{{x}_{i}}x_{i}^{T}e}+\sum\limits_{i=1}^{n}{x_{i}^{T}{{x}_{i}}}\notag \\& =-\sum\limits_{i=1}^{n}{{{e}^{T}}{{x}_{i}}x_{i}^{T}e}+\sum\limits_{i=1}^{n}{x_{i}^{T}{{x}_{i}}} \\\end{align}\]

记$S=\sum\limits_{i=1}^{n}{({{x}_{i}}-m){{({{x}_{i}}-m)}^{T}}}=\sum\limits_{i=1}^{n}{{{x}_{i}}x_{i}^{T}}$(假设样本均值为$\vec{0}$ ),称为样本的散布矩阵,它比样本的协方差矩阵就差个常数,代表样本分散程度。将散布矩阵带入(4)得到误差函数 \[\begin{align}J(e)=-{{e}^{T}}Se+\sum\limits_{i=1}^{n}{x_{i}^{T}{{x}_{i}}}\end{align}\]

最小化$J(e)$ 等价于最小化$-{{e}^{T}}Se$,所以进一步简化(5)为\[\begin{align}J(e)=-{{e}^{T}}Se\end{align}\]

另外,由于我们规定$e$是单位向量,所以最小化(6)是含有等式约束${{e}^{T}}e=1$ 的优化问题,写出对应拉格朗日函数\[\begin{align}J(e,\lambda )=-{{e}^{T}}Se+\lambda {{e}^{T}}e\notag\end{align}\]

对$e$求偏导数并令其为0,得到 \[\begin{align}Se=\lambda e\end{align}\]

说明要求解的$e$ 正好是样本散布矩阵的特征向量,$\lambda $ 为对应的特征值。将(7)代回(6)得到\[\begin{align}J(e)=-{{e}^{T}}Se=-\lambda\notag\end{align}\]

所以要是误差函数最小,$\lambda $ 应该为最大特征值,$e$应该为散布矩阵$S$最大特征值对应的特征向量。

角度2:最大方差

现在换一个角度,来考虑映射完成后数据的方差,这方差越大越好,因为投影方式已经给定(垂直投影),那么投影后数据方差越大,就说明投影后的数据跟好地反映了原始数据的分布特性。原始数据${{x}_{i}}$投影后对应的数据为${{\alpha }_{i}}={{e}^{T}}{{x}_{i}}$ ,那么投影后数据的方差为\[\begin{align}D(e) &=\sum\limits_{i=1}^{n}{\alpha _{i}^{2}}\notag \\& =\sum\limits_{i=1}^{n}{{{e}^{T}}{{x}_{i}}x_{i}^{T}e}\notag \\& ={{e}^{T}}Se \notag\\\end{align}\]

可见最大化$D(e)$ 和最小化(5)(6)是一致的。

另外可以将(5)式$J(e)$和$D(e)$相加看看,结果为$J(e)=-{{e}^{T}}Se+\sum\limits_{i=1}^{n}{x_{i}^{T}{{x}_{i}}}$,是原始数据的方差(假设均数据均值为$\vec{0}$ )。而$D(e)$为映射后数据的方差,$J(e)$则可以理解为映射过程对数据方差造成的损失,从这个角度也说明了最大化$D(e)$和最小化$J(e)$的等价性,一句话,映射最大程度保留数据的方差,方差就是变化,变化才体现数据的信息。

三、 总结

经过以上两步,原始数据向一维数据映射的过程就完成了。先计算散布矩阵$S$的最大特征值对于的归一化特征向量$e$,然后计算投影结果${{\alpha }_{i}}={{e}^{T}}{{x}_{i}}$。

显然,只向一维映射可能会损失数据好多的信息,这取决于数据本身的分布。一般情况下还是要多向几个维度映射一下,将原来的数据映射为3维,4维等等。具体映射到几维没有标准,映射维度越高,越能保留原始的数据形象,但也越起不到降维简化数据的目的,所以需要两者之间一个权衡~

怎么向更高维映射呢?和一维类推一下就知道,如果要映射到$p$维,这$p$个方向应该是散步矩阵最大$p$个特征值对应的特征向量所决定的方向。

记\[X=\left[ \begin{matrix}x_{1}^{T}  \\x_{2}^{T}  \\\vdots   \\x_{n}^{T}  \\\end{matrix} \right]\] ,散步矩阵前$p$个最大特征值对应的规范化特征向量为$E=\left[ \begin{matrix}{{e}_{1}}, & {{e}_{2}}, & \cdots , & {{e}_{p}}  \\\end{matrix} \right]$ ,那么PCA过程可以写作 \[Y=XE\]

$Y$ 的每一行为映射后的一个数据点。

此外,$Y$可以表示为\[\begin{align}Y& =\left[ {{Y}_{1}},{{Y}_{2}},\cdots ,{{Y}_{n}} \right] \notag\\& =[X{{e}_{1}},X{{e}_{2}},\cdots ,X{{e}_{n}}] \notag\\\end{align}\]

所以\[{{Y}_{i}}=X{{e}_{i}}=X{{e}_{i1}}+X{{e}_{i2}}+\cdots +X{{e}_{in}}\]

${{Y}_{i}}$ 即是第$i$ 个主成份,它是原数据的一个线性组合。

散布矩阵的特征向量体现数据的变化方向,越大特征值对应的特征向量越体现数据的主要变化方向,所以映射后的每一维所蕴含的原始数据信息是递减的,原始数据主要信息都体现在映射后前面几个维度上,这也是映射过程依次按照特征值大小选取映射方向的原因。对于$p$的选择没有严格的金标准,但还是有一些经验法则,比如Kaiser-Harris法则建议选取大于1的特征值对应的特征向量。

PCA--主成份分析的更多相关文章

  1. PCA主成份分析

    1   背景介绍 真实的训练数据总是存在各种各样的问题: 1. 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余. 2. ...

  2. pca主成份分析方法

    1.应用pca的前提 应用pca的前提是,连续信号具有相关性.相关性是什么,是冗余.就是要利用pca去除冗余. 2.pca的定义 pca是一种去除随机变量间相关性的线性变换.是一种常用的多元数据分析方 ...

  3. Spark 2.0 PCA主成份分析

    PCA在Spark2.0中用法比较简单,只需要设置: .setInputCol(“features”)//保证输入是特征值向量 .setOutputCol(“pcaFeatures”)//输出 .se ...

  4. 【主成份分析】PCA推导

    ### 主成份分析(Pricipal components analysis PCA) 假设空间$R^{n}$中有m个点{$x^{1},......,x^{n}$},希望压缩,对每个$x^{i}$都有 ...

  5. PCA主成份分析学习记要

    前言 主成份分析,简写为PCA(Principle Component Analysis).用于提取矩阵中的最主要成分,剔除冗余数据,同时降低数据纬度.现实世界中的数据可能是多种因数叠加的结果,如果这 ...

  6. principal components analysis 主成份分析

    w http://deeplearning.stanford.edu/wiki/index.php/主成份分析 主成分分析(PCA)及其在R里的实现 - jicf的日志 - 网易博客  http:// ...

  7. 主成份分析PCA

    Data Mining 主成分分析PCA 降维的必要性 1.多重共线性--预测变量之间相互关联.多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯. 2.高维空间本身具有稀疏性.一维正态分布有6 ...

  8. 吴裕雄 python 机器学习——主成份分析PCA降维

    # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...

  9. PCA(主成分析)

    PCA通过将高维空间向量映射到低维,对于数据进行处理

随机推荐

  1. JMeter5.0 边界提取器使用

    需求: 需要提取下图中requestNo的值,使用JMeter3.1和4.0版本,使用正则表达式提取器始终无法获取 而后使用JMeter5.0的边界提取器,不需要写复杂的正则表达式,只要填写左右边界即 ...

  2. TOSCA自动化测试工具视频资料

    https://www.udemy.com/ search 'TOCSA' 找到两个免费资料学习

  3. [2013-1-29] Air 安卓 天气预报源码

    开源一个air android纯代码天气预报源码,未作优化~ ,仅供学习使用,勿作商用~   花了两天时间,随便写了个天气预报 小应用 .纯代码,没有用组件,所以体积要小点.效率么...主要是没有去优 ...

  4. firewall 防火墙相关

    修改配置文件: /etc/sysconfig/network-scripts/ifcfg-ens33 文件 ONBOOT=no 改为yes 然后重启  service network restart ...

  5. c++第三十二天

    p164~p170: 大致内容 迭代语句 1.while语句. 2.传统for. 3.范围for.两个注意点是:1- 通常使用auto来确保类型相容,2- 如果需要修改元素则需要使用&符(还可 ...

  6. RabbitMQ 高级指南

    1 RabbitMQ 简介 1.1 介绍 RabbitMQ 是一个由 erlang 开发的基于 AMQP(Advanced Message Queue)协议的开源实现.用于在分布式系统中存储转发消息, ...

  7. MVC 4中的前端渲染 @Helper指令

    如果我们需要在一个页面或多个页面显示如人民币格式(后台传回来的无¥)¥的格式化.或是对后台数据作如保留小数个数等处理,这些东西经常要用到,特别是一些NULL值的处理,有可能会出错.这时我们可以通过创建 ...

  8. 20135320赵瀚青LINUX第六周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 这周主要讲解的是进程. ...

  9. Win7下硬盘安装fedora17

    Win7下硬盘安装fedora17 这几天经过很多次的百度和实验,终于成功的在我的x64机子上装上了fedora17,以此分享给大家,希望能给大家帮助. 一.准备工作: 1.工具,因为我们电脑上大部分 ...

  10. js 的胖箭头问题

    我们在声明函数的时候通常是 var foo function(a){ console.log(a) }; 用ES6 我们写成了这样 var foo = a =>{ console.log(a); ...