主成份分析(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. 【转】C#操作xml

    XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内 ...

  2. 对Java ConcurrentHashMap的一些了解

    ①引言(为什么要使用ConcurrentHashMap) 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. Has ...

  3. Spark高级数据分析· 3推荐引擎

    推荐算法流程 推荐算法 预备 wget http://www.iro.umontreal.ca/~lisa/datasets/profiledata_06-May-2005.tar.gz cd /Us ...

  4. 一道C++练习题,替换一个字符串里所有实例

    做了一道C++练习题,替换一个字符串里面的所有实例. #include <iostream> #include <string> using namespace std; co ...

  5. 照着官网来安装openstack pike之nova安装

    nova组件安装分为控制节点和计算节点,还是先从控制节点安装 1.前提条件,数据库为nova创建库和账户密码来连接数据库 # mysql -u root -p MariaDB [(none)]> ...

  6. 20144303《Java程序设计》第10周学习总结

    20144303<Java程序设计>第10周学习总结 教材学习内容总结 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程 ...

  7. Fiddler4工具配置及调试手机和PC端浏览器

    Fiddler最大的用处: 模拟请求.修改请求.手机应用调试 Fiddler最新版本 下载地址: http://www.telerik.com/download/fiddler Fiddler 想要监 ...

  8. Duilib + wke 设置wke背景透明

    WkeWebKit.cpp 新增 wkeSetTransparent(m_pWebView, true); void CWkeWebkitUI::DoInit() { CControlUI::DoIn ...

  9. .net 数据缓存(一)之介绍

    现在的业务系统越来复杂,大型门户网站内容越来越多,数据库的数据量也越来愈大,所以有了“大数据”这一概念的出现.但是我们都知道当数据库的数据量和访问过于频繁都会影响系统整体性能体验,特别是并发量高的系统 ...

  10. ubuntu 18.04 64bit下如何安装python开发工具jupyterhub

    注:这是多用户版本 1.安装依赖 sudo apt-get install npm nodes sudo apt-get install python3-distutils wget https:// ...