主要内容本系列马上就要进入建模的阶段了,但是在这之前还有一些准备工作要做,能让我们最终得到的分析结果更好,数据降维便是其中之一。
数据降维实际上是对输入特征的一次精简。通常来说当我们已经通过数据处理得到了一组变量(特征)之后,我们并不会直接将这些变量输入某种统计模型(比如SVM)。因为第一,某些变量之间可能存在着某种线性非线性的关系,如果一股脑将全部变量都输入模型可能会影响模型的精度。第二,变量(特征)数量相对数据条数有可能过大,从而不符合某些模型的需求。打个比方,如果你有100条数据,却有200个特征,那么大多数的模型都回报错,提醒你变量(特征)数量太多。
正是由于以上的原因也是为了更好的理解数据,阅读数据的信息,我们会采用一些数据降维的办法对变量(特征)数目进行一定程度的缩减,在不丢失绝大多数信息的前提下尽可能的生成解释力更强的特征,同时去除不必要的特征。
我们这篇文章主要介绍的就是主成分分析法。主成分分析(Principal Component Analysis,PCA)大概是数据降维最常用的方法之一了,主要通过线性变换的方式,达到特征压缩解释变量的目的。该算法主要分为6个步骤:
1)构建p*n阶的变量矩阵
2)将p*n阶的变量矩阵X的每一行(代表一个属性字段)进行标准化
3)求出协方差矩阵C
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k列组成矩阵P
6)Y=XP即为降维到k维后的数据
2-5所设计的算法步骤,主要是为了找到p个变量的正规化线性组合,从而使它的方差达到最大。在本篇文章里我们并不会对其中所涉及的数学推导进行解读,对于大部分R语言的使用者,我们只需要了解模型的输入与输出,了解我们可以用PCA干什么就OK了。
1.输入
PCA算法的输入是一个变量矩阵,即每列代表一个变量,每行代表一条数据。举个例子,如果我们有三个变量,四条数据,那么此时n=4,p=3,我们就可以生生如下的4*3阶变量矩阵:
[1,] [2,] [3,]
[1,] x1 y1 z1
[2,] x2 y2 z2
[3,] x3 y3 z3
[4,] x4 y4 z4
这个变量矩阵就是我们要输入R语言中PCA函数的东西。
2.输出
介绍完了输入的变量矩阵,我们再来说说我们期望以及我们可以从PCA这个方法中得到的东西。
我们使用PCA方法的最终目的是为了一组新的变量来代替原有的变量,即生成原有变量的一种重新组合(线性组合或非线性组合)的方法。比如,如果原有的变量是x,y,z,那么我们可能最终通过某种计算得知x^2+3y,5y-2z^3已经可以解释98%的原有变量x,y,z中所包含的信息,那么我们就将使用x^2+3y,5y-2z^3作为我们新的模型变量。
上面两个新变量是过去变量的非线性组合,而PCA生成的则是变量之间的线性组合。这样的线性组合可以用一个矩阵清晰的表达,比如以下矩阵(本文后面例子的结果):
> p$loadings
Loadings:
Comp.1 Comp.2 Comp.3 Comp.4
Sepal.Length 0.361 -0.657 -0.582 0.315
Sepal.Width -0.730 0.598 -0.320
Petal.Length 0.857 0.173 -0.480
Petal.Width 0.358 0.546 0.754
其中Comp.1-Comp.4就是我们新生成的变量,而Sepal.Length, Sepal.Width, Petal.Length, Petal.Width则是原始的变量,通过这个矩阵我们可以知道(以Comp.1和Comp.2为例):
Comp.1=0.361*Sepal.Length+0.857*Petal.Length+0.358*Petal.Width
Comp.2=-0.657*Sepal.Length-0.730*Sepal.Width+0.173*Petal.Length
实际上,这就是我们期望的输出,亦即想要的新变量的生成方法。
下面我们就真刀实枪用R语言的对一组变量进行主成分分析,Rcode非常简单:
R语言里使用PCA方法
我们这次使用的是iris这个数据集(经常被各种例子用到的经典数据集),数据集概况如下:
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
显然,前四列是鸢尾花的不同特征,最后一列是其属于的品种,那么输入的模型矩阵即为该数据集的前四列的矩阵,即:
iris[,1:4]
接着我们只需使用一个函数(princomp())就可以完成主成分分析的工作:
p
我们可以继续查看返回的结果:
> summary(p)
Importance of components:
Comp.1 Comp.2 Comp.3 Comp.4
Standard deviation 2.0494032 0.49097143 0.27872586 0.153870700
Proportion of Variance 0.9246187 0.05306648 0.01710261 0.005212184
Cumulative Proportion 0.9246187 0.97768521 0.99478782 1.000000000
> p$loadings
Loadings:
Comp.1 Comp.2 Comp.3 Comp.4
Sepal.Length 0.361 -0.657 -0.582 0.315
Sepal.Width -0.730 0.598 -0.320
Petal.Length 0.857 0.173 -0.480
Petal.Width 0.358 0.546 0.754
从summary()里我们可以看到,主成分分析法为我们生成了四个新的变量,第一个变量可以解释原数据92.5%的方差,第二个变量则可以解释元数据5.3%的方差。显然,这两个数据加起来已经可以解释原数据97.8%的信息了,所以我们可以用这两个新的变量代替原来四个初始变量。
从loadings里面我们可以进一步查看这四个变量(主要关注的是前两个变量)是怎么生成的,通过返回的矩阵我们可知:
Comp1=0.361*Sepal.Length+0.857*Petal.Length+0.358*Petal.Width
Comp2=-0.657*Sepal.Length-0.730*Sepal.Width+0.173*Petal.Length
可以看到,新生成的变量是原有变量的线性组合。
还记得原来算法的第五步和第六步吗?我们重温一下:
5)取前k列组成矩阵P
6)Y=XP即为降维到k维后的数据
P是于是我们可以用一行代码通过矩阵乘法生成新的变量:
newfeature
结语
或者关注我的知乎账号:温如
如果觉得《python主成分分析法降维_【数据降维】主成分分析法》对你有帮助,请点赞、收藏,并留下你的观点哦!