写在前面:
- 看完这篇文章,你会知道:
- ①为什么要用PCA?
- ②PCA的原理?
- ③slearn中的PCA如何使用?
- 资料来源于互联网及课堂讲义;
- 欢迎讨论和补充~
1 背景
1.1 维数灾难
在做数据挖掘的时候,经常会遇到数据体量过大的情况,这种大体量往往会在两方面:
- 样本量过大(表现为行多);
- 样本特征过多(表现为列多);
从而在处理的时候会占用很多时间和空间,耗费大量的成本。
维数灾难(Course of Dimensionality)就是人们在对这种现象抽象化的概念。
对于提高运算效率的需求一直以来都存在——
1.2 解决之道
我们的对策往往也是针对行和列,以及算法、算力上进行展开的。
一方面,样本上,通常采用抽样的方法:
- 我们知道样本代表着观测结果。如果没有重复的冗余数据,每一条都可以是有价值的。抽样就是从数据集中选取一小部分的数据进行分析,需要注意的是抽样规则很大程度会影响模型的训练效果(比如在样本不均衡的时候可以采用SMOTE等方法);
另外,特征上,可以进行特征选择和潜在特征构建:
- 特征选择(Feature selection):选取一部分有用或有价值的特征进入模型进行训练;
- 潜在特征构建(Latent feature creation):新建新的字段来描述原本的特征。如对一类特征进行降维处理,使得降维后的数据能够表达原本的信息;
但是,高维数据的低位表达,即降维,必然会来信息的丢失:
如袁博老师提到的例子(上图右侧):将一个三位的圆环从不同角度去观测,并映射到二维平面时,会得到不同的结果。每个结果始终会和原本的圆环有出入。
如果接触不到,那就无限接近。
保留全部信息是一种奢望,那确保降维过程能够尽可能保留原本数据的信息,就成了整个问题的核心。
PCA,Principle Component Analysis,就是一种较为简单和普遍的降维方法——
2 PCA
一句话定义:通过线性线性变换,将数据映射到低维的子空间中的降维方法,期间尽可能防止信息丢失。
2.1 从一个例子开始
问题来了,什么是数据的信息?
很简单,举个例子,比如一群人的身高体重分布如下:
我们能够说他们有所不同,正是因为组内,人与人之间的身高体重有差别。
如果一个维度的差别越大,比如身高从1.5m~2m,那可以说组内的信息量就会比较多。反之,如果大家都是1.65m,那我们能从组里得到的信息就很少,几乎没有分析价值。
那保留原本信息的目标就可以转换为保留原本方差,即数据的离散程度。
目标清楚了之后,就可以开始降维了。
它会需要我们重新构建一个基向量,其中包含两方面:方向和位置:
得到方向:将原本的数据映射到不同方向的单位向量上,会有不同的结果。我们有很多种选择,如何获得更好方向的呢?
还是上面的例子(二维往下就是一维啦):