1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > python主成分分析法降维_【数据降维】主成分分析法

python主成分分析法降维_【数据降维】主成分分析法

时间:2020-02-05 01:35:42

相关推荐

python主成分分析法降维_【数据降维】主成分分析法

主要内容本系列马上就要进入建模的阶段了,但是在这之前还有一些准备工作要做,能让我们最终得到的分析结果更好,数据降维便是其中之一。

数据降维实际上是对输入特征的一次精简。通常来说当我们已经通过数据处理得到了一组变量(特征)之后,我们并不会直接将这些变量输入某种统计模型(比如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

结语

或者关注我的知乎账号:温如

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。