PCA算法理解及代码实现

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

原文地址:https://www.cnblogs.com/lliuye/p/9156763.html

时间: 2024-08-27 02:38:25

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

python-Kmeans\Kmeans++算法理解及代码实现

一.      环境: Python 3.7.4 Pycharm Community 2019.3 二.      问题:      对六个样本点[1, 5], [2, 4], [4, 1], [5, 0], [7, 6], [6, 7]进行K-means聚类. 三.      理论推导 此处依照我个人理解所写,错误之处欢迎指出 K-means核心操作为:聚类中心选取—分类—调整聚类中心—再次分类并调整聚类中心直到调整幅度小于阈值或程序运行轮数大于阈值 选取聚类中心: 聚类中心的选取可以选择随机

KMP算法的理解和代码实现

KMP算法理解参考原文:http://kb.cnblogs.com/page/176818/ 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. 2. 因为B与A不匹配,搜索词再往后

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

一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在

【转载】对一致性Hash算法,Java代码实现的深入研究

原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这

降维之pca算法

pca算法: 算法原理: pca利用的两个维度之间的关系和协方差成正比,协方差为0时,表示这两个维度无关,如果协方差越大这表明两个维度之间相关性越大,因而降维的时候, 都是找协方差最大的. 1 将XX中的数据进行零均值化,即每一列都减去其均值. 2 计算协方差矩阵C=1mXTXC=1mXTX 3 求出CC的特征值和特征向量 4 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P 5 Y=XPY=XP就是降维到k维后的数据. 代码: # coding=utf-8 import m

PCA算法

1. 引言 降维是对数据高维度特征的一种预处理方法.降维是将高纬度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的.在实际的生产和应用中,降维在一定的信息损失范围内,可以节省大量的时间和成本. PCA(principal compount analysis),即主成分分析法,是一种使用最广泛的数据压缩算法.在PCA中,数据从原来的坐标系转换到新的坐标系,由数据本身决定.转换坐标系时,以方差最大的方向作为坐标轴方向,因为数据的最大方差给出了数据的最重要的信息.第

采样方法(二)MCMC相关算法介绍及代码实现

采样方法(二)MCMC相关算法介绍及代码实现 2017-12-30 15:32:14 Dark_Scope 阅读数 10509更多 分类专栏: 机器学习 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Dark_Scope/article/details/78937731 0.引子 书接前文,在采样方法(一)中我们讲到了拒绝采样.重要性采样一系列的蒙特卡洛采样方法,但这些方法在高维空间时都

编程算法 - 丑数 代码(C)

丑数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 我们把只包含因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数. 可以设置一个数组包含所需要的丑数, 依次比较乘以2, 乘以3, 乘以5的最小的数, 最后返回结果. 如第5个丑数是5, 如1, 2, 3, 4(2*2), 5均是丑数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*ecli

机器学习实战ByMatlab(二)PCA算法

PCA 算法也叫主成分分析(principal components analysis),主要是用于数据降维的. 为什么要进行数据降维?因为实际情况中我们的训练数据会存在特征过多或者是特征累赘的问题,比如: 一个关于汽车的样本数据,一个特征是"km/h的最大速度特征",另一个是"英里每小时"的最大速度特征,很显然这两个特征具有很强的相关性 拿到一个样本,特征非常多,样本缺很少,这样的数据用回归去你和将非常困难,很容易导致过度拟合 PCA算法就是用来解决这种问题的,其