github:PCA代码实现PCA应用
本文算法均使用python3实现


1. 数据降维

  在实际生产生活中,我们所获得的数据集在特征上往往具有很高的维度,对高维度的数据进行处理时消耗的时间很大,并且过多的特征变量也会妨碍查找规律的建立。如何在最大程度上保留数据集的信息量的前提下进行数据维度的降低,是我们需要解决的问题。
  对数据进行降维有以下优点
  (1)使得数据集更易使用
  (2)降低很多算法的计算开销
  (3)去除噪声
  (4)使得结果易懂
  降维技术作为数据预处理的一部分,即可使用在监督学习中也能够使用在非监督学习中。而降维技术主要有以下几种:主成分分析(Principal Component Analysis,PCA)因子分析(Factor Analysis),以及独立成分分析(Independent Component Analysis, ICA)。其中主成分分析PCA应用最为广泛,本文也将详细介绍PCA。


2. 主成分分析(PCA)

  我们利用一个例子来理解PCA如何进行降维的。
  参考下图,对于样本数据 $ D=\lbrace x^{(1)},x^{(2)},...,x^{(m)} \rbrace$ ,其中 $ x^{(i)} = [ x^{(i)}_1 , x^{(i)}_2]^T $

  我们需要将上图的样本数据由二维降至一维。即 $ x^{(i)} \to z^{(i)} ,i=1,2,...,m $ ,如下图:

  一般来说,这些样本点在坐标图中任意一条向量上都可以投影成一维的,那么我们如何选择最佳投影向量呢?在第1节中我们提到,需要在最大程度上保留数据集的信息量的前提下进行数据维度的降低,因此我们需要有优化目标来对图中的向量进行选择。
  而PCA的优化目标就是:
  (1)对于 $ 2 $ 维降到 $ 1 $ 维:找到一个投影方向,使得投影误差和最小
  (2)对于 $ n $ 维降到 $ k $ 维:找到 $ k $ 个向量定义的 $ k $ 维投影平面,使得投影误差和最小
  那么投影误差又是什么呢?投影误差即为,每一个样本点到投影向量或者投影平面的距离。而投影误差和即为所有样本点到投影向量或投影平面的距离的和。
  为什么要将“投影误差和最小”最为优化目标呢
  我们以以下例子进行解释。下面两幅图展示了两种不同投影向量:

  我们能够和清楚地看到,对于第一种向量的投影误差和一定比第二种的投影误差和要小。
  对应以上两幅图的投影结果:

  假设对于原样本中,位于第一象限的三个样本点属于类别“A”,位于第三象限的两个样本点属于类别“B”。经过投影后,我们可以看出,对于第一种降维,在降维后仍旧保持了位于原点右侧的三个样本属于类别“A”,位于原点左侧的两个样本属于类别“B”。而对于第二种投影,明显可以看出,已经不能够分辨出样本的类别了。换句话说,第二种投影方式丢失了一些信息。
  因此,“投影误差和最小”便成为我们所需要优化的目标。
  那么如何寻找投影误差最小的方向呢?
  寻找到方差最大的方向即可。方差最大与投影误差最小这两个优化目标其实本质上是一样的,具体可参考周志华著《机器学习》一书,书中证明了最大可分性(误差最大)最近重构性(投影和最小)两种优化等价。
  到此我们就对PCA的降维方式已经有了初步的理解。


3. PCA算法思路与要点

3.1 PCA算法思路

  PCA算法思路主要是:数据从原来的坐标系转换到新的坐标系,由数据本身决定。转换坐标系时,以方差最大的方向作为坐标轴方向,因为数据的最大方差给出了数据的最重要的信息。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴选择的是与第一个新坐标轴正交且方差次大的方向。重复该过程,重复次数为原始数据的特征维数。
  通过这种方式获得的新的坐标系,我们发现,大部分方差都包含在前面几个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面的几个含有绝大部分方差的坐标轴。事实上,这样也就相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,也就实现了对数据特征的降维处理。

3.2 PCA算法要点

  根据以上PCA算法思路的描述,我们大概可以看出,对于PCA算法,其要点主要是如何找到方差最大的方向
  这里将提到有关线性代数里的一些内容:
  (1)协方差矩阵
    (1.1)特征 $ X_i $ 与特征 $ X_j $ 的协方差(Covariance): \[ Cov(X_i, X_j) = \frac{\sum_{k=1}^n(X_i^{(k)} - \overline{X}_i)(X_j^{(k)}-\overline{X}_j)}{n-1} \]
      其中 $ X_i^{(k)}, X_j^{(k)} $ 表示特征 $ X_i.X_j $ 的第 $ k $ 个样本中的取值。而 $ \overline{X}_i,\overline{X}_j $ 则是表示两个特征的样本均值。
      可以看出,当 $ X_i = X_j $ 时,协方差即为方差
    (1.2)对于一个只有两个特征的样本来说,其协方差矩阵为: \[ C = \begin{bmatrix} Cov(X_1,X_1) & Cov(X_1,X_2) \\ Cov(X_2,X_1) & Cov(X_2,X_2) \\ \end{bmatrix} \]
      当特征数为 $ n $ 时,协方差矩阵为 $ n \times n $ 维的矩阵,且对角线为各特征的方差值。
  (2)特征向量与特征值
    对于矩阵 $ A $ ,若满足 $ A \zeta = \lambda \zeta $ ,则称 $ \zeta $ 是矩阵 $ A $ 的特征向量,而 $ \lambda $ 则是矩阵 $ A $ 的特征值。将特征值按照从大到小的顺序进行排序,选择前 $ k $ 个特征值所对应的特征向量即为所求投影向量。
    对于特征值与特征向量的求解,主要是:特征值分解(当 $ A $ 为方阵时),奇异值SVD分解(当 $ A $ 不为方阵时)


4. PCA算法过程


  输入:训练样本集 $ D ={x^{(1)},x^{(2)},...,x^{(m)}} $ ,低维空间维数 $ d' $ ;
  过程:.
  1:对所有样本进行中心化(去均值操作): $ x_j^{(i)} \leftarrow x_j^{(i)} - \frac{1}{m} \sum_{i=1}^m x_j^{(i)} $ ;
  2:计算样本的协方差矩阵 $ XX^T $ ;
  3:对协方差矩阵 $ XX^T $ 做特征值分解 ;
  4:取最大的 $ d' $ 个特征值所对应的特征向量 $ w_1,w_2,...,w_{d'} $
  5:将原样本矩阵与投影矩阵相乘: $ X \cdot W $ 即为降维后数据集 $ X' $ 。其中 $ X $ 为 $ m \times n $ 维, $ W = [w_1,w_2,...,w_{d'}] $ 为 $ n \times d' $ 维。
  5:输出:降维后的数据集 $ X' $



5. PCA算法分析

  优点:使得数据更易使用,并且可以去除数据中的噪声,使得其他机器学习任务更加精确。该算法往往作为预处理步骤,在数据应用到其他算法之前清洗数据。
  缺点:数据维度降低并不代表特征的减少,因为降维仍旧保留了较大的信息量,对结果过拟合问题并没有帮助。不能将降维算法当做解决过拟合问题方法。如果原始数据特征维度并不是很大,也并不需要进行降维。


引用及参考:
[1]《机器学习》周志华著
[2]《机器学习实战》Peter Harrington著
[3] https://www.cnblogs.com/zy230530/p/7074215.html
[4] http://www.cnblogs.com/zhangchaoyang/articles/2222048.html
[5] https://www.cnblogs.com/terencezhou/p/6235974.html

写在最后:本文参考以上资料进行整合与总结,属于原创,文章中可能出现理解不当的地方,若有所见解或异议可在下方评论,谢谢!
若需转载请注明https://www.cnblogs.com/lliuye/p/9156763.html

PCA算法理解及代码实现的更多相关文章

  1. kmeans算法理解及代码实现

    github:kmeans代码实现1.kmeans代码实现2(包含二分k-means) 本文算法均使用python3实现 1 聚类算法   对于"监督学习"(supervised ...

  2. k邻近算法理解及代码实现

    github:代码实现 本文算法均使用python3实现 1 KNN   KNN(k-nearest neighbor, k近邻法),故名思议,是根据最近的 $ k $ 个邻居来判断未知点属于哪个类别 ...

  3. 模式识别(1)——PCA算法

    作者:桂. 时间:2017-02-26  19:54:26 链接:http://www.cnblogs.com/xingshansi/articles/6445625.html 声明:转载请注明出处, ...

  4. 三种方法实现PCA算法(Python)

    主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...

  5. Python使用三种方法实现PCA算法[转]

    主成分分析(PCA) vs 多元判别式分析(MDA) PCA和MDA都是线性变换的方法,二者关系密切.在PCA中,我们寻找数据集中最大化方差的成分,在MDA中,我们对类间最大散布的方向更感兴趣. 一句 ...

  6. 机器学习--主成分分析(PCA)算法的原理及优缺点

    一.PCA算法的原理 PCA(principle component analysis),即主成分分析法,是一个非监督的机器学习算法,是一种用于探索高维数据结构的技术,主要用于对数据的降维,通过降维可 ...

  7. PCA算法 | 数据集特征数量太多怎么办?用这个算法对它降维打击!

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第27文章,我们一起来聊聊数据处理领域的降维(dimensionality reduction)算法. 我们都知道,图片 ...

  8. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  9. PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?

    PCA, Principle Component Analysis, 主成份分析, 是使用最广泛的降维算法. ...... (关于PCA的算法步骤和应用场景随便一搜就能找到了, 所以这里就不说了. ) ...

随机推荐

  1. memcache类的扩展函数

    Memcache — Memcache类 /****连接****/1.Memcache::connect – 创建一个Memcache对象语法:bool Memcache::connect ( str ...

  2. hadoop生态搭建(3节点)-16.elk配置

    # ==================================================================ELK环境准备 # 修改文件限制 # * 代表Linux所有用户 ...

  3. e+\e-

    aE-0b aE+0b 分别是 a*10的负b次方 和a*10的b次方 不能省略 + - 号和十位  

  4. linux 搭建ss

    因为收藏的各种教程被xx,所以决定自己写 第一步.安装ss sudo pip install shadowsocks 第二步.配置IP.端口.密码.加密方式 vi /etc/shadowsocks.j ...

  5. BZOJ1924_所驼门王的宝藏_KEY

    题目传送门 这道题苟了我好久,因为链表的内存问题,之后再细讲. 首先这是一道Tarjan+DAG上DP的题目. 有三种门,对于每种门可以和其他门相连.即连边. 使用链表快速查询连边. 建完图后可以进行 ...

  6. 北京Uber优步司机奖励政策(12月19日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. 老曹眼中的Linux基础

    Linux 几乎无处不在,不论是服务器构建,还是客户端开发,对操作系统的基本理解和基础技能的掌握对全栈来说都是必备的. 系统的选择 Linux发行版本大体分为两类,一类是商业公司维护的发行版本,一类是 ...

  8. VINS(二)Feature Detection and Tracking

    系统入口是feature_tracker_node.cpp文件中的main函数 1. 首先创建feature_tracker节点,从配置文件中读取信息(parameters.cpp),包括: ROS中 ...

  9. crontab执行PHP

    在stackoverflow上看到一个问题:http://stackoverflow.com/questions/14015543/crontab-php-wget-or-curl 有三种通过cron ...

  10. CentOS下安装Tomcat环境

    一.安装JAVA环境 1.安装JAVA mkdir -p /usr/local/java 下载jdk1.7.0_67.tar.gz包,并解压到 tar xf jdk1.7.0_67.tar.gz -C ...