本文已参加「新人创作礼」活动,一同开启创作之路。

前言

PCA多用于对数据特搜集进行降维,也便利对数据集进行可视化操作,说白了最终进行成果展现那么多特征向量要一同表明的话必定很难展现,超越三维的数据就很难展现了。而PCA可对特搜集进行简化,通俗的来讲也便是兼并好了解。PCA使用的范围很广因而很有必要要学习,原理必定仍是数学证明,在特征工程上常常运用。希望读者看完能够提出过错或许看法,博主会长期维护博客做及时更新。纯共享,希望我们喜爱。

一、为什么需求PCA?(为什么要降维)

在各个领域进行数据收集或是数据采样时往往都是存在多个方针或是特征用来表明某一现象或是用来作评价好坏。可是庞大的数据量难以展现,对多维数据剖析的难度很大。更重要的是在大都状况下,许多变量之间或许存在相关性,从而增加了问题剖析的复杂性,一起对剖析带来不便利。假如分别对每个方针进行剖析,剖析往往是孤立的,而不是归纳的。盲目减少方针会损失许多信息,简略产生过错的定论。

咱们常常用二维模型来进行成果展现,一般进行展现的数据都是二维数据,可是想象一下关于四维以及四维以上的数据咱们该怎么进行展现?

例如咱们要对地铁拥堵状况进行评价和展现,关于评价地铁拥堵状况,咱们将选用

PCA(主成分分析法)原理以及应用+代码实现
这九个方针进行预测地铁拥堵状况。咱们一般在一张坐标轴上进行效果展现从而进行剖析,但在对这些多维数据进行展现的话咱们寻常的展现效果图必定展现不出来。数据往往拥有超出显现能力的更多特征。数据显现并非大规模特征下的仅有难题,对数据进行简化还有如下一系列的原因:

  • 使得数据集更简略运用;
  • 降低许多算法的核算开支;
  • 去除噪声;
  • 使得成果简略了解;

在已标示与未标示的数据上都有降维技能。这儿咱们将首要重视未标示数据上的降维技能,该技能一起也能够使用于已标示的数据。

而在数据特征工程降维技能中,PCA的使用目前最为广泛。

二、PCA简介

主成分剖析法(PCA)是设法将本来变量从头组合成一组新的彼此无关的几个归纳变量,一起依据实际需求从中能够取出几个较少的总和变量尽或许多地反映本来变量的信息的统计办法叫做主成分剖析或称主重量剖析,也是数学上处理降维的一种办法。主成分剖析是设法将本来很多具有必定相关性(比如P个方针),从头组合成一组新的互相无关的归纳方针来替代本来的方针。一般数学上的处理便是将本来P个方针作线性组合,作为新的归纳方针。

在数学上更简略的了解咱们能够把它想象为对许多个坐标点经过映射办法到一根函数直线上。经过这种办法咱们必定会得到新的特征用来表明这个事情,新的特征剔除了原有特征的冗余信息,因而更有区分度。新的特征依据原有特征,它能够重建原有特征。主成分剖析要保存最有或许重建原有特征的新特征,从而到达数据降维的效果。

PCA(主成分分析法)原理以及应用+代码实现
例如咱们得到了一个二维数据集,里边一个标签只是只用两个(x1,x2)特征就能表明,可是咱们只能用一个特征去描绘这件事。在原始的x1,x2坐标轴上,咱们无论删掉x1或许是x2咱们都不能完好的表达出这个点来。可是咱们能够经过PCA,将数据从本来的坐标系转化到了新的坐标系,新坐标系的挑选是由数据本身决议的。榜首个新坐标轴挑选的是原始数据中方差最大的方向,第二个新坐标轴的挑选和榜首个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。就经过该数据集(x1,x2),咱们经过该办法构建出(y1,y2)坐标系,在该坐标系中咱们能够发现数据根本都会集在y1轴上面,而y2这条短轴上则距离很小。在极端的状况,短轴假如退化成一点,那只要在长轴的方向才能够解释这些点的变化了;这样,由二维到一维的降维就自然完成了。

三、PCA算法推导

要具体了解PCA算法原理仍是需求必定的数学根底的,不是那么简略了解推导出来的。可是能够尽或许的简化推导过程,可是仍是有有必要清楚把握的数学知识。

1.投影

首先咱们知道在笛卡尔直角坐标系中上面的点都能够用一个二维向量表明。当然假如是维向量能够等价表明为维空间中的一条从原点发射的有向线段,只不过便是很那表明。假定咱们就在二维笛卡尔直角坐标系中,有

,那么在二维平面上A和B能够用两条发自原点的有向线段表明,如下图:

PCA(主成分分析法)原理以及应用+代码实现
咱们知道垂线与B的交点叫做A在B上的投影,再假定A与B的夹角为a,则投影的矢量长度为(这儿假定向量B的模为1).

便是A点的模,也便是A线段的标量长度。

而且咱们知道:。

假如B向量的模为1的话,咱们就能够发现得到.

2.基

一个二维向量能够对应二维笛卡尔直角坐标系中从原点出发的一条有向线段,关于()来说,那么他们对应的坐标轴便是:

PCA(主成分分析法)原理以及应用+代码实现
咱们假定有一点(3,2),而它对应的向量就为从原点到(3,2)的有向线段,而咱们知道该向量在轴上的投影值3,在y轴上的投影值为2。咱们设该点为A。

在x轴上:x\cdot A=|A||x|cos(a),而在x轴上咱们能够设它的模为1,x可为(1,0).

在y轴上:y\cdot A=|A||y|cos(a),而在y轴上咱们能够设它的模为1,y可为(1,0).

经过简略的数学改换,向量(x1,x2)实际上表明线性组合:

PCA(主成分分析法)原理以及应用+代码实现
不难证明所有二维向量都能够表明为这样的线性组合,此处(1,0)和(0,1)叫做二维空间的一组基。

PCA(主成分分析法)原理以及应用+代码实现
所以,要精确描绘向量,首先要确定一组基,然后给出基所在的各个直线上的投影值,就能够了,只不过咱们常常省掉榜首步,而默认以和为基。

当然咱们也能够以其他向量为基底,(1,1)(1,1)和(1,-1)也能够成为一组基。

一般来说,咱们希望基的模是1,由于从内积的含义能够看到,假如基的方式1,那么就能够便利的用向量点乘基而直接获得其在新基上的坐标了!实际上,对应于任何一个向量咱们总能够找到其同方向上模为1的向量,只需让两个重量分别除以模就好了,例如上面的基就能够变为:(1/\sqrt{2},1/\sqrt{2}),(1/\sqrt{2},-1/\sqrt{2})。

现在咱们想获得(3,2)在新基上的坐标,即在两个方向上的投影矢量值,那么依据内积的几许含义,咱们只需分别核算(3,2)和两个基的内积,不难得到新的坐标为((5/ \sqrt{2}, -1/\sqrt{2} ) )。

PCA(主成分分析法)原理以及应用+代码实现

3.基改换的矩阵表明

将改换为新基上的坐标,便是用与榜首个基做内积运算,作为榜首个新的坐标重量,然后用与第二个基做内积运算,作为第二个新坐标的重量。实际上,咱们能够用矩阵想成的方式简练的表明这个改换:

PCA(主成分分析法)原理以及应用+代码实现
那么关于多个二维向量,例如(1,1),(2,2),(3,3)想改换到方才那组基上,则能够变为这样:

PCA(主成分分析法)原理以及应用+代码实现

一般地,假如咱们有M个N维向量,想将其改换为由R个N维向量表明的新空间中,那么首先将R个基依照行组成矩阵A,,然后将向量依照列组成矩阵B,那么两个矩阵的乘积AB便是改换成果,其间AB的第m列为A中的第M列改换后的成果。 数学表明为:

PCA(主成分分析法)原理以及应用+代码实现
特别要注意的是,这儿R能够小于N,而R决议了改换后数据的维数,也便是说,咱们能够将一个N维数据改换到更低维度的空间中去,改换后的维度取决于基的数量,因而这种矩阵相乘的表明也能够表明为降维改换。

4.方差

现在咱们知道能够经过将原始矩阵(特搜集)经过投影的方法映射到不同的基底上从而构建新的特征,经过改换后到达降维的意图。而现在咱们要知道怎么挑选正确的基底来帮助咱们降维。

咱们知道要使得向量经过投影之后更具有区分性,经过投影后要尽或许的分散。而这种分散程度,能够用数学上的方差来表述。

此处,一个字段的方差能够看干事每个元素与字段均值的差的平方和的均值,即:

PCA(主成分分析法)原理以及应用+代码实现
但假如每一次核算方差都要减去一个字段均值明显更加累赘。咱们能够经过对数据的预处理使得字段的均值为0,例如咱们的数据由五条记载组成,将它们表明为矩阵方式:

PCA(主成分分析法)原理以及应用+代码实现
咱们经过减去均值得到:

PCA(主成分分析法)原理以及应用+代码实现
这样的话就为0了,因而方差能够直接用每个元素的平方和除以元素个数表明:

PCA(主成分分析法)原理以及应用+代码实现

于是上面的问题被方式化表明为:寻觅一个一维基,使得所有数据改换为这个基上的坐标表明后,方差值最大。

5.协方差

上述办法只能处理二维到一维的降维,可是关于多维数据咱们榜首步挑选方差最大化的降榜首维方法,那么咱们第二步该怎么挑选呢?

假如咱们仍是单纯的只挑选方差最大的方向,很明显,这个方向与榜首个方向应该是“几乎重合在一同”,明显这样的维度是没有用的,因而应该有其他约束条件。

数学上能够用两个字段的协方差表明其相关性

  • 是一种用来衡量两个随机变量联系的统计量。
  • 只能处理二维问题。
  • 核算协方差需求核算均值。

PCA(主成分分析法)原理以及应用+代码实现

由于现已让每个字段均值为0,则:

PCA(主成分分析法)原理以及应用+代码实现

能够看出,在字段均值为0的状况下,两个字段的协方差简练的表明为其内积除以元素数m。协方差的绝对值越大,则二个变量彼此影响越大。

当协方差为0时,表明两个字段彻底独立,为了让协方差为0,咱们挑选第二个即时只能在与榜首个基正交的方向上挑选。因而最终挑选的两个方向必定是正交的。

  至此,咱们得到了降维问题的优化方针:将一组N维向量降维k维(K大于0,小于N),其方针是挑选K个单位(模为1)正交基,使得原始数据改换到这组基上后,各字段两两间协方差为0,而字段的方差则尽或许大(在正交的约束下,取最大的k个方差)。

PCA(主成分分析法)原理以及应用+代码实现

然后咱们用X乘以X的转置,并乘上系数1/m:

PCA(主成分分析法)原理以及应用+代码实现

这时候咱们会发现,这个矩阵对角线上的两个元素分别是两个字段的方差,而其他元素是a和b的协方差,两者被一致到了一个矩阵的。

依据矩阵相乘的运算法则,这个定论很简略被推行到一般状况:

设咱们有m个n维数据记载,将其按列排成n乘m的矩阵X,设C= 1/mXXT,则C是一个对称矩阵,其对角线分别是各个字段的方差,而第l行j列和j行i列元素相同,表明i和j两个字段的协方差。

6.协方差矩阵

假定咱们只要a和b 两个字段,那么咱们将他们按行组成矩阵X:

PCA(主成分分析法)原理以及应用+代码实现

  • 协方差矩阵能处理多维问题;
  • 协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。
  • 协方差矩阵核算的是不同维度之间的协方差,而不是不同样本之间的。
  • 样本矩阵中若每行是一个样本,则每列为一个维度,所以核算协方差时要按列核算均值。

假如数据是3维,那么协方差矩阵是:

PCA(主成分分析法)原理以及应用+代码实现

7.特征值与特征向量

PCA(主成分分析法)原理以及应用+代码实现
关于也能够写作:

PCA(主成分分析法)原理以及应用+代码实现

8. 协方差矩阵对角化

设原始数据矩阵X关于的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为X对P做基改换后的数据,设Y的协方差矩阵为D,咱们推导一下D与C的联系:

PCA(主成分分析法)原理以及应用+代码实现

其实到这儿快差不多了,优化方针变成了寻觅一个矩阵P,满意PCPT是一个对角矩阵,而且对角元素依照从大到小依次摆放,那么P的前K行便是要寻觅的基,用P的前K行便是要寻觅的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满意上述优化条件。

协方差矩阵C是一个对称矩阵,在线性代数上,实对称矩阵有一系列非常好的性质:

实对称矩阵不同特征值对应的特征向量必定正交。
设特征向量  重数为r,则必定存在r个线性无关的特征向量对应于 ,因而能够将这r个特征向量单位正交化。

一个n行n列的实对称矩阵必定能够找到n个单位正交特征向量,设这n个特征向量为e1, e2, …en,咱们将其依照列组成矩阵:

PCA(主成分分析法)原理以及应用+代码实现

则对协方差矩阵C有如下定论:

PCA(主成分分析法)原理以及应用+代码实现

其间 为对称矩阵,其对角元素为各特征向量对应的特征值(或许有重复)。

到这儿,咱们发现咱们现已找到了需求的矩阵P:

PCA(主成分分析法)原理以及应用+代码实现

P是协方差矩阵的特征向量单位化后依照行摆放出的矩阵,其间每一行都是C的一个特征向量,假如设P依照 中特征值从大到小,将特征向量从上到下摆放,则用P的前K行组成的矩阵乘以原始数据矩阵X,就能够得到咱们需求的降维后的数据矩阵Y。

至此,咱们完成了整个PCA的数学原理评论。

四、PCA运用流程

PCA(主成分分析法)原理以及应用+代码实现

1) 将原始数据按列组成n行m列矩阵X 2)将X的每一行(代表一个特点字段)进行零均值化(去平均值),即减去这一行的均值 3)求出协方差矩阵 C= 1/mXXT
4)求出协方差矩阵的特征值及对应的特征向量 5)将特征向量按对应特征值大小从上到下按行摆放成矩阵,取前k行组成矩阵P(保存最大的k各特征向量) 6)Y=PX 即为降维到K维后的数据

将数据转化成前N个主成分的伪代码大致如下:

去除平均值
核算协方差矩阵
核算协方差矩阵的特征值和特征向量
将特征值从大到小排序
保存最上面的N个特征向量
将数据转化到上述N个特征向量构建的新空间中
from numpy import *
#从一个文本文件中读入一个数据集,数据集示例如下:
'''
8.805945	10.575145
9.584316	9.614076
11.269714	11.717254
9.120444	9.019774
7.977520	8.313923
'''
def loadDataSet(fileName, delim='\t'):
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [map(float,line) for line in stringArr]
    return mat(datArr)
#依据numpy实现pca算法	
def pca(dataMat, topNfeat=9999999):                           #原数据  m*n
    meanVals = mean(dataMat, axis=0)                          #均值:1*n
    meanRemoved = dataMat - meanVals 			              #去除均值  m*n
    covMat = cov(meanRemoved, rowvar=0)                       #协方差矩阵 n*n
    eigVals,eigVects = linalg.eig(mat(covMat))				  #特征矩阵  n*n
    eigValInd = argsort(eigVals)            #将特征值排序
    eigValInd = eigValInd[:-(topNfeat+1):-1]  #仅保存p个列(将topNfeat了解为p即可)   
    redEigVects = eigVects[:,eigValInd]       # 仅保存p个最大特征值对应的特征向量,按从大到小的次序重组特征矩阵n*p
    lowDDataMat = meanRemoved * redEigVects		#将数据转化到低维空间lowDDataMat: m*p
    reconMat = (lowDDataMat * redEigVects.T) + meanVals    #从压缩空间重构原数据reconMat:  m*n
    return lowDDataMat, reconMat

点重视,防走丢,如有疏忽之处,请留言指导,非常感谢

以上便是本期全部内容。我是fanstuck ,有问题我们随时留言评论 ,咱们下期见。

我正在参加技能社区创作者签约计划招募活动,点击链接报名投稿。