在因子分析(Factor analysis)中,介绍了一种降维概率模型,用EM算法(EM算法原理详解)估计参数。在这里讨论另外一种降维方法:主元分析法(PCA),这种算法更加直接,只需要进行特征向量的计算,不需要用到EM算法。

  假设数据集表示 m 个不同类型汽车的属性,比如最大速度,转弯半径等等. 对于任意一辆汽车,假设第 i 个属性和第 j 个属性 xixj 分别以 米/小时 和 千米/小时 来表示汽车的最大速度,那么很显然这两个属性是线性相关的,所以数据可以去掉其中一个属性,即在 n-1 维空间处理即可. 这只是一个小小的例子,在大多数现实的数据中,有太多这样的数据冗余和重复,所以要想办法自动检测和去掉这些数据冗余。

  例如现在对无线控制直升飞机的飞行员做一个调查,用衡量飞行员 i 的飞行技能的熟练程度,衡量飞行员享受飞行的程度,不过由于无线控制直升机很难操纵,所以只有那些具有熟练飞行技巧的飞行员才是真正享受飞行过程,才算得上优秀的飞行员。所以 x1x2 指向具有很大的关联。于是,我们根据 x1x画出数据,可以发现,数据主要都分布在坐标轴的角平分线方向变化 (u1所示方向),只有很少的点偏离这条线,如下图所示:

在执行PCA算法之前,需要对数据进行预处理,对数据的均值和方差进行归一化:

  1. 代替每一个
  2. 代替每一个

步骤(1-2)是为了保证数据的均值为0,对于那些均值本来就为0的数据集,这两步可以省略(例如语音的时序序列,或者其他声音信号).

步骤(3-4)保证每个坐标的方差为1,这样不同的属性值就被归一到同一个可比较的范围内处理,例如 x1 表示汽车的速度是几十或者几百米每小时,x2 表示汽车里面的座位数大约是2-4,那么就是通过方差的归一化使得这种差距较大的属性数据值有可比性。当然,如果我们确切知道原始数据中所有属性的取值都在同一个可比较的范围内,步骤(3-4)也是可以省略的,比如一个关于图像中各个像素点灰度值得数据集,每一个数据点的范围都是{0,1, ... ,255},所以方差就不用归一化.

预处理之后,如何检测出数据的主要变化方向呢?就是说想找到某一方向,使得大部分数据都近似分布在这个方向附近。

考虑下面进过归一化的数据:

下面我们画出了一个方向 u,圆点表示原始数据在 上的映射:

可以看出映射后的数据之间相距较远,即方差值较大,并且数据点都距原点较远,再考虑另一个方向:

可以看出,这些映射后的数据点方差较小,而且距离原点比较近。

我们想要做的就是运用算法自动从上面类似的各个方向中选出最合适的方向。


给定单位向量 u 和一个点 x, 映射到 上投影的长度为 xTu, 即一个数据集中的点 x(i) 映射到 u 上之后到原点的距离为 xTu

因为要选择出数据的主要变化方向 u, 从上面两个不同方向的例子可以看出,如果在原始数据主要沿某一方向变化较大,那么原始数据在这个方向上投影点的方差就较大,所以要找到u,就是最大化原数据在 u 方向上投影点的方差,通常把 u 设定为单位向量:

最大化上面的式子,注意到, 假设原始数据的均值为0(这一点要注意,同时也告诉我们为什么前面要将数据均值归一化为0),那么正好是原始数据的协方差矩阵(关于协方差矩阵的概念参考协方差详解l

要想使得上面式子取得最大值,u 必须取 Σ 的主特征向量方向(可以定性理解为一个矩阵的主特征方向包含着该矩阵最多的信息)。更加一般地,想要把原始数据映射到一个 k 维的子空间(k<n),应该选择出 Σ 的k个最主要的特征向量 u1, u2, ..., uk,k 个向量组成了一组新的正交基。

把数据映射到新的正交基所表示的空间:

这样在尽可能多保留原始数据信息的情况下,把数据由 n 维降低至 k 维.因此PCA就是一种数据降维算法, u1, u2, ..., uk,叫做原始数据的前 k 个主成分.关于具体实践参考:PCA和白化练习之处理二维数据.

有时候数据维度高不仅仅是因为数据存在冗余,而是存在了一些噪声,所以PCA同样具有降噪的作用。


总结:

PCA就是一种把原始数据投影到该数据集的主特征方向上的操作,因为一个数据集的主特征方向包含着绝大部分该数据的信息,通过选取合适数量的特征向量,既可以保留原始数据的信息,又能实现数据降维降噪,到底具体选取几个特征向量通常是根据特征值来判断,用选取的特征向量对应的特征值之和比上所有特征值之和,结果一般要求大于95%即可,即保留了原始数据95%的信息,当然也可以根据问题的具体要求,调整这个选择的阈值。

Principal components analysis(PCA):主元分析的更多相关文章

  1. Andrew Ng机器学习公开课笔记–Principal Components Analysis (PCA)

    网易公开课,第14, 15课 notes,10 之前谈到的factor analysis,用EM算法找到潜在的因子变量,以达到降维的目的 这里介绍的是另外一种降维的方法,Principal Compo ...

  2. [zz] Principal Components Analysis (PCA) 主成分分析

    我理解PCA应该分为2个过程:1.求出降维矩阵:2.利用得到的降维矩阵,对数据/特征做降维. 这里分成了两篇博客,来做总结. http://matlabdatamining.blogspot.com/ ...

  3. 主成分分析 | Principal Components Analysis | PCA

    理论 仅仅使用基本的线性代数知识,就可以推导出一种简单的机器学习算法,主成分分析(Principal Components Analysis, PCA). 假设有 $m$ 个点的集合:$\left\{ ...

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

    Principal Components Analysis (一)引入PCA    当我们对某个系统或指标进行研究时往往会发现,影响这些系统和指标的因素或变量的数量非常的多.多变量无疑会为科学研究带来 ...

  5. 主成分分析(principal components analysis, PCA)

    原理 计算方法 主要性质 有关统计量 主成分个数的选取 ------------------------------------------------------------------------ ...

  6. 主成分分析(principal components analysis, PCA)——无监督学习

    降维的两种方式: (1)特征选择(feature selection),通过变量选择来缩减维数. (2)特征提取(feature extraction),通过线性或非线性变换(投影)来生成缩减集(复合 ...

  7. principal components analysis 主成份分析

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

  8. 机器学习:Principal components analysis (主分量分析)

    Principal components analysis 这一讲,我们简单介绍Principal Components Analysis(PCA),这个方法可以用来确定特征空间的子空间,用一种更加紧 ...

  9. Jordan Lecture Note-10: Kernel Principal Components Analysis (KPCA).

    Kernel Principal Components Analysis PCA实际上就是对原坐标进行正交变换,使得变换后的坐标之间相互无关,并且尽可能保留多的信息.但PCA所做的是线性变换,对于某些 ...

随机推荐

  1. day29 __eq__ 比较

    本质上 "==" 调用的内部方法就是 __eq__() 正常情况下,两个名字相同的变量比较的是内存地址,内存地址当然是不一样的可以使用__eq__来改变成名字相同就相等 1 cla ...

  2. jasperReport和Ireport

    <!-- groovy --> <dependency> <groupId>org.codehaus.groovy</groupId> <arti ...

  3. 【BZOJ2003】[HNOI2010]矩阵(搜索)

    [BZOJ2003][HNOI2010]矩阵(搜索) 题面 懒得粘了,不难找吧. 题解 看的学长写的题解,也懒得写了 大概是这样的. 不难发现只需要确定第一行和第一列就能确定答案,而确定第一行之后每确 ...

  4. [CF1132F]Clear the String

    题意 给你一个串s,每次可以花费1的代价删去一个子串,要求子串的每一位为同一个字符. 求删去整个串的最小代价. 分析 这是一道非常简单的区间\(DP\)问题,我们定义\(f[i][j]\)表示删去子串 ...

  5. Python中threading的join和setDaemon的区别及用法

    Python多线程编程时经常会用到join()和setDaemon()方法,基本用法如下: join([time]): 等待至线程中止.这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或 ...

  6. luogu2279 消防局的设立 (贪心)

    按点的深度从大到小排序,每次取出深度最大的那个点,如果它还没被覆盖,就在它爷爷上放一个消防局,这样一定是最优的 为了判定是否被覆盖,可以记录从某点的子树中到这个点的最近消防局的距离dis[](如果没有 ...

  7. C#基础 常用语&数据类型定义&类型转换

    int temp = Console.Read(); Console.WriteLine(temp); Console.Read(); Console.Write("  ");直接 ...

  8. “由于下列错误,Parallel port driver 服务启动失败”,注意了

    最近在“事件查看器”中发现这么一个错误:“由于下列错误,Parallel port driver 服务启动失败”, 我到网上搜索了一下,发现很多网页上都说解决办法: 把HKEY_LOCAL_MACHI ...

  9. array扩展运算符

    扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // 1 2 3 console ...

  10. 关于scrollintoview()真的是有意思极了,结合普通tab切换一起看看

    scrollIntoView(alignWithTop) 是html5新特性中的一个元素,他主要是指滚动浏览器窗口或容器元素,以便在当前视窗的可见范围看见当前元素. alignWithTop是true ...