PCA算法浅析
最近频繁在论文中看到「PCA」的影子,所以今天决定好好把「PCA」的原理和算法过程弄清楚。
「PCA」是什么
PCA,又称主成分分析,英文全称「Principal Components Analysis」。维基百科上的解释是:「PCA」是一种分析、简化数据集的技术,经常用于减少数据集的维数,同时保持数据集中对方差贡献最大的特征。说得通俗一点,就是把数据集中重要的特征保存下来,把不重要的特征去除掉。
为什么要做这种事情呢?特征越多不是对分析问题更有帮助吗?确实,特征越多,涵盖的信息理论上会越多。但要注意一点,这个假设成立的前提是特征本身都彼此无关,并能描述事物的某些属性。如果由特征 A 可以推出特征 B,或者特征 B 所描述的属性与问题本身无关,或者特征 A 和特征 B 描述的是同一个特征,那么特征 B 是没有价值的。在机器学习里面,特征越多意味着需要更多的训练样本(否则容易 underfit ),但真实情况是,训练数据并不容易获取。基于以上种种,如果能构提取出特征的主要部分,那么,不仅数据将变得简单清晰,训练过程也会更快,效果理论上也会更好才是。
「PCA」算法过程
「PCA」的目标是把原来 n 维特征的数据压缩成 k 维特征。
接下来用一个例子说明「PCA」的执行流程(这个例子参考自文末链接主成分分析(Principal components analysis)-最大方差解释)。
假设我们得到 2 维数据如下:
\[
Data=\begin{array}{c|lcr} x & y \\ \hline 2.5 & 2.4 \\ 0.5 & 0.7 \\ 2.2 & 2.9 \\ 1.9 & 2.2 \\ 3.1 & 3.0 \\ 2.3 & 2.7 \\ 2 & 1.6 \\ 1 & 1.1 \\ 1.5 & 1.6 \\ 1.1 & 0.9 \\  \end{array}
\]
行代表样例,列代表特征,这里有 10 个样例,每个样例有两个特征。
step1 归一化样本数据
分别求出 x 和 y 的平均值,对于所有样本,都减去平均值。这里 x 的均值为 1.81,y 的均值为 1.91。归一化后得到:
\[
Data=\begin{array}{c|lcr} x & y \\ \hline 0.69 & 0.49 \\ -1.31 & -1.21 \\ 0.39 & 0.99 \\ 0.09 & 0.29 \\ 1.29 & 1.09 \\ 0.49 & 0.79 \\ 0.19 & -0.31 \\ -0.81 & -0.81 \\ -0.31 & -0.31 \\ -0.71 & -1.01 \\  \end{array}
\]
step2 求协方差矩阵
由于原样本中的特征是 2 维的,所以得到的协方差矩阵的维度是 \(2*2\) (关于协方差矩阵的求法,参见上一篇文章协方差矩阵)。这里省略过程,直接给出结果:
\(cov=\begin{bmatrix} 0.616555556 & 0.615444444 \\ 0.615444444 & 0.716555556 \end{bmatrix}\)
step3 求协方差矩阵的特征值和特征向量
由于协方差矩阵是对称矩阵,因此在数学计算上更加方便。关于矩阵如何求特征值和特征向量,下次再写一篇相关的文章。这里假设我们已经求出了特征值和特征向量:
\[
eigenvalues=\left( \begin{matrix} 0.490833989 \\ 1.28402771 \end{matrix} \right)
\]
\[
eigenvectors=\left( \begin{matrix} -0.735178656 & -0.677873399 \\ 0.677873399 & -0.735178656 \end{matrix} \right)
\]
上面是两个特征值,下面是对应的特征向量,特征值 0.0490833989 对应的特征向量为 \((-0.735178656, 0.677873399)^T\),这里的特征向量都为归一化后的向量。
step4 选取特征向量矩阵
将特征值按照从大到小的顺序排列,选择其中最大的 k 个,然后将其对应的 k 个特征向量分别作为列向量组成特征向量矩阵。由于这里特征值只有两个,我们选择较大的那个,也就是 1.28402771,得到的特征向量矩阵为:
\[
\begin{bmatrix}  -0.677873399 \\ -0.735178656 \end{bmatrix}
\]
step5 将样本投影到特征矩阵上
假设样本数为 m,特征数为 n,归一化后的样本矩阵为 DataAdjust(m * n),协方差矩阵为 n * n,选取的 k 个特征向量组成的矩阵为 EigenVectors(n * k),则投影后得到的最终数据为:
FinalData(m * k) = DataAdjust(m * n) * EigenVectors(n * k)
在本例中,
\[
FinalData(m*k)=\begin{array}{c|lcr} x \\ \hline -0.82797 \\ 1.77758 \\ -0.992197494 \\ -0.27421 \\ -1.67580 \\ -0.91294 \\ 0.09910 \\ 1.14457 \\ 0.43804 \\ 1.22382 \\  \end{array}
\]
这样,我们就将原始的 n 维特征数据变成了 k 维(本例中,是 2 维到 1 维)。
总结
讲到这,「PCA」的流程就基本结束了。
不过,总结之前还有个细节要交代。虽然 step1 的时候我们已经对数据做了归一化,让数据的特征值都平移到原点附近,但对不同特征之间方差差异较大的问题仍然没解决(比如:样本第一个特征是汽车速度「0~100」,第二个特征是汽车座位数「2~6」,那么很明显,第一个特征的方差比第二个大很多)。不解决这个问题会有什么问题暂不清楚。消除这种差异的方法,除了减去均值外,还需要除以各自的标准差,流程归纳如下:
- Let \(\mu = \frac{1}{m} \sum_{i=1}^m{x^{(i)}}\)
- Replace each \(x^{(i)} \text{with} \ x^{(i)}-\mu\)
- Let \(\sigma_{j}^2 = \frac{1}{m} \sum_{i}{({x_{j}^{(i)}})^2}\)
- Replace each \(x_j^{(i)} \text{with} \ \frac{x_j^{(i)}}{\sigma_j}\)
(注:\(x^{(i)}\) 代指每个样例)
PCA的总体流程为:
- 样本归一化;
- 求样本特征的协方差矩阵;
- 选取k个最大的特征值;
- 组成特征向量矩阵;
- 将样本数据投影到特征向量矩阵上。
实际应用
在机器学习中,我们通过训练集计算出特征向量矩阵并降维,然后在降维后的训练集上进行训练。预测的时候,我们同样需要对测试集进行降维(要保证数据模型的统一),降维的方法是用训练集计算出来的特征向量矩阵与测试集的数据相乘,然后再对降维的测试数据进行预测评估。
参考
PCA算法浅析的更多相关文章
- PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?
		PCA, Principle Component Analysis, 主成份分析, 是使用最广泛的降维算法. ...... (关于PCA的算法步骤和应用场景随便一搜就能找到了, 所以这里就不说了. ) ... 
- 模式识别(1)——PCA算法
		作者:桂. 时间:2017-02-26 19:54:26 链接:http://www.cnblogs.com/xingshansi/articles/6445625.html 声明:转载请注明出处, ... 
- 三种方法实现PCA算法(Python)
		主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ... 
- 降维之pca算法
		pca算法: 算法原理: pca利用的两个维度之间的关系和协方差成正比,协方差为0时,表示这两个维度无关,如果协方差越大这表明两个维度之间相关性越大,因而降维的时候, 都是找协方差最大的. 将XX中的 ... 
- PCA算法学习(Matlab实现)
		PCA(主成分分析)算法,主要用于数据降维,保留了数据集中对方差贡献最大的若干个特征来达到简化数据集的目的. 实现数据降维的步骤: 1.将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩 ... 
- OpenCV学习(35) OpenCV中的PCA算法
		PCA算法的基本原理可以参考:http://www.cnblogs.com/mikewolf2002/p/3429711.html 对一副宽p.高q的二维灰度图,要完整表示该图像,需要m = ... 
- 我所认识的PCA算法的princomp函数与经历 (基于matlab)
		我接触princomp函数,主要是因为实验室的项目需要,所以我一接触的时候就希望快点学会怎么用. 项目中需要利用PCA算法对大量数据进行降维. 简介:主成分分析 ( Principal Compone ... 
- PCA算法的最小平方误差解释
		PCA算法另外一种理解角度是:最小化点到投影后点的距离平方和. 假设我们有m个样本点,且都位于n维空间 中,而我们要把原n维空间中的样本点投影到k维子空间W中去(k<n),并使得这m个点到投影点 ... 
- PCA算法理解及代码实现
		github:PCA代码实现.PCA应用 本文算法均使用python3实现 1. 数据降维 在实际生产生活中,我们所获得的数据集在特征上往往具有很高的维度,对高维度的数据进行处理时消耗的时间很大, ... 
随机推荐
- linux ssh 报错failed - POSSIBLE BREAK-IN ATTEMPT
			linux ssh 报错failed - POSSIBLE BREAK-IN ATTEMPT 问题故障: 今天在新租的虚拟机上,发现ssh登陆机器的时候报错,如下: [root@pictures_ne ... 
- 2018ccpc秦皇岛站后记
			总的来说这不是一场体验十分好的比赛. 定的宾馆有一点小,学校提供的伙食人太多了,不想排队,饭票又不能换香蕉,就没有吃. 到的第一天遇到了价格向上取整和到站不打发票的两个黑车司机,让我对这个地点好感大减 ... 
- python 模块二(os,json,pickle)
			#################################总结##################### os常用 os.makedirs('baby/安哥拉/特斯拉/黄晓明') os.mkd ... 
- 如何在Ubuntu上开启SSH服务
			更新源列表 打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"-- ... 
- poi读取写入word【未完,待续】
			, [项目实战]Java POI之Word导出经典案例一 Java POI 读取word文件 POI-对于WORD的操作(一) 
- jQuery使用(六):DOM操作之元素包裹、克隆DOM与data的综合应用
			包裹 wrap() wrapInner() wrapAll() unwrap() clone() 数据缓存机制 data 文档处理(包裹) 1.1.wrap()--将所匹配的元素用其他元素结构化标签包 ... 
- HDU 1892(书架统计 二维树状数组)
			题意是在二维平面上在一些位置上进行数据的增删改查操作,使用树状数组(了解树状数组点这里) 原来的树状数组在求区间和时是 sum( x, y ) = getsum( y ) - getsum( x - ... 
- Oracle的 listagg() WITHIN GROUP ()函数使用
			1.使用条件查询 查询部门为20的员工列表 -- 查询部门为20的员工列表 SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO = ... 
- 对空间数据(Shape)重新排序
			打开ArcToolBox,数据管理工具->常规(General)->排序 
- springboot(十七):过滤器(Filter)和拦截器(Interceptor)
			概述 在做web开发的时候,过滤器(Filter)和拦截器(Interceptor)很常见,通俗的讲,过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”, ... 
