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. 数据降维 在实际生产生活中,我们所获得的数据集在特征上往往具有很高的维度,对高维度的数据进行处理时消耗的时间很大, ...
随机推荐
- qml: QtCharts模块的使用(基本配置)------<一>
QtCharts模块可以用于绘制图表: 导入模块: import QtCharts 2.2 例子: import QtQuick 2.0 import QtCharts 2.2 ChartView { ...
- Shell中引号的操作
单引号.双引号.反撇号的作用与区别 单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用,唯一需要注意的点是不允许引用自身: 示例如下: sh-4.2# echo ...
- mysql清理binlog日志
mysql的binlog日志过多过大,清理过程. 1.查看binlog日志 mysql> show binary logs; +------------------+-----------+ | ...
- CentOS7 下 Hadoop 单节点(伪分布式)部署
Hadoop 下载 (2.9.2) https://hadoop.apache.org/releases.html 准备工作 关闭防火墙 (也可放行) # 停止防火墙 systemctl stop f ...
- Hadoop记录-Hadoop jmx
https://cwiki.apache.org/confluence/display/EAG/Hadoop+JMX+Monitoring+and+Alerting curl http://10.11 ...
- .aspx、MasterPage、.ascx加载顺序
1. Master page中的用户控件的 page_init2. Aspx页面中的用户控件的 page_init3. Master page的page_init4. Aspx ...
- C#中的特性(Attributes)
约定: 1.”attribute”和”attributes”均不翻译 2.”property”译为“属性” 3.msdn中的原句不翻译 4.”program entity”译为”语言元素” Attri ...
- Tomcat与Web应用
1.Web是一种分布式应用架构,旨在共享分布 在网络上的各个Web服务器中的所有互相链接的信息.Web使用超级文本技术(HTML)来链接网络上的信息,信息存放在服务器端,客户机通过浏览器查找网络中的各 ...
- 对XML文件进行的修改
XmlDocument xml = new XmlDocument(); xml.Load(Way);//获取相对路径 var Exports = xml.GetElementsByTagName(& ...
- 关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法
类的定义与对象的实例化操作 <?php //类里面的成员是属于对象的class Hero{ public $name;//成员变量 //成员属性(存在于强类型语言中) prot ...