机器学习数据降维方法 PCA主成分分析

机器学习数据降维方法 PCA主成分分析,第1张

PCA在机器学习中很常用,是一种无参数的数据降维方法。PCA步骤:
将原始数据按列组成n行m列矩阵X将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值求出协方差矩阵求出协方差矩阵的特征值及对应的特征向量将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵PY=PX即为降维到k维后的数据1 PCA的推导
PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
我们知道PCA是一种数据降维的方法,在降低维度的过程中,我们当然想要保留更多的特征,PCA就是经过数学推导,保留最多特征同时降维的方法。
在推导之前要先知道几个基础知识:
内积与投影
两个维数相同的向量的内积被定义为:

假设A和B是两个n维向量,我们知道n维向量可以等价表示为n维空间中的一条从原点发射的有向线段,为了简单起见我们假设A和B均为二维向量,则A=(x1,y1),B=(x2,y2)。则在二维平面上A和B可以用两条发自原点的有向线段表示,见下图:

现在我们从A点向B所在直线引一条垂线。我们知道垂线与B的交点叫做A在B上的投影,再设A与B的夹角是a,则投影的矢量长度为|A|cos(a),其中|A|是向量A的模,也就是A线段的标量长度。
到这里还是看不出内积和这东西有什么关系,不过如果我们将内积表示为另一种我们熟悉的形式:

现在事情似乎是有点眉目了:A与B的内积等于A到B的投影长度乘以B的模。再进一步,如果我们假设B的模为1,即让|B|=1,那么就变成了:

也就是说,设向量B的模为1,则A与B的内积值等于A向B所在直线投影的矢量长度!这就是内积的一种几何解释,也是我们得到的第一个重要结论。在后面的推导中,将反复使用这个结论。

下面我们继续在二维空间内讨论向量。上文说过,一个二维向量可以对应二维笛卡尔直角坐标系中从原点出发的一个有向线段。例如下面这个向量:

在代数表示方面,我们经常用线段终点的点坐标表示向量,例如上面的向量可以表示为(3,2),这是我们再熟悉不过的向量表示。
我们列举的例子中基是正交的(即内积为0,或直观说相互垂直),但可以成为一组基的唯一要求就是线性无关,非正交的基也是可以的。不过因为正交基有较好的性质,所以一般使用的基都是正交的。
3 基变换的矩阵表示
一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。(新基按行,向量按列)
特别要注意的是,这里R可以小于N,而R决定了变换后数据的维数。也就是说,我们可以将一N维数据变换到更低维度的空间中去,变换后的维度取决于基的数量。因此这种矩阵相乘的表示也可以表示降维变换。
最后,上述分析同时给矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。更抽象的说,一个矩阵可以表示一种线性变换。很多同学在学线性代数时对矩阵相乘的方法感到奇怪,但是如果明白了矩阵相乘的物理意义,其合理性就一目了然了。
4 协方差矩阵与优化目标
我们从上面的矩阵乘法与基变换可以看出,当新基的维数小于原来的维数时可以做到数据的降维,但是究竟如何选择新基就是我们现在面临的问题,我们想要选择一个维数更小的新基,同时新基保留有更多的信息。我们知道矩阵向新基投影的形式,也就是PCA是将一组N维的特征投影到K维(K<n)同时保留更多的特征。 p=""></n)同时保留更多的特征。>
那么怎么衡量更多的特征,也就是投影后尽量少的重叠,投影值尽可能分散。
协方差
从二维到一维的降维,只需要找到一个一维基使得方差最大,但是三维降到二维呢?我们需要找到两个基让这个三维数据投影到两个基上,如果我们找方差最大的两个基,会发现他们完全一样或者线性相关,这和一个基没什么区别,不能表达更多的信息,所以我们需要添加限制条件,我们希望这两个基彼此线性无关,扩展到K个基也是一样。
当协方差为0时,表示两个字段完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。
至此,我们得到了降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。
关于PCA的贡献率与K的选择
在我的文章特征值和特征向量中说过,特征值反映了矩阵对于特征向量的拉伸程度,只有拉伸而没有旋转,也就是在特征向量方向上的作用程度,所以在PCA中我们选取前K个特征向量组成新基进行投影,就是因为原特征在前K个特征向量有最大的作用程度。
投影过后可以保留更多的信息,作用程度是用特征值表示的,所以我们可以使用下面的式子表示贡献率,贡献率是表示投影后信息的保留程度的变量,也就是特征值的总和比上前K个特征值,一般来说贡献率要大于85%。

最近在 3d face 模型生成研究中,经常使用PCA,所以就把PCA的学习记录了下来。主成分分析(PCA, Principal Component Analysis)为我们提供了一种压缩数据的方式,我们也可以将它看作学习数据表示的无监督学习算法。PCA学习一种比原始维度更低的表示,也学习了一种元素之间没有线性相关的表示。我们知道一个经典的无监督学习任务就是找到数据的最佳表示。最佳表示可以是在比本身表示的信息更简单或者更易访问受到一些惩罚火或限制的情况下,尽可能多地保留原始数据的信息。那么PCA就为我们提供了这样一种方法。

PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。

我们有样本X和样本Y,那么可以得到样本X的均值:

样本X方差:

由以上的基础公式我们可以得出以下的结论:

协方差为正时,说明X和Y是正相关关系;协方差为负时,说明X和Y是负相关关系;协方差为0时,说明X和Y是相互独立,互不相关。Cov(X,X)就是X的方差。当样本是n维数据时,它们的协方差实际上是协方差矩阵(对称方阵)。例如,对于3维数据(x,y,z),计算它的协方差就是:

其实协方差矩阵和散度矩阵关系密切,散度矩阵就是协方差矩阵乘以(总数据量-1)。因此它们的 特征值 特征向量 是一样的。这里值得注意的是,散度矩阵是 SVD奇异值分解 的一步,因此PCA和SVD是有很大联系

其中,λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。

其中,Q是矩阵A的特征向量组成的矩阵,而矩阵Σ则是一个对角阵,对角线上的元素就是特征值。

假设A是一个mn的矩阵,那么得到的U是一个 mm 的方阵,U里面的正交向量被称为左奇异向量。Σ是一个 mn 的矩阵,Σ除了对角线其它元素都为0,对角线上的元素称为奇异值。 Vt (t在右上角)是v的转置矩阵,是一个 nn 的矩阵,它里面的正交向量被称为右奇异值向量。而且一般来讲,我们会将Σ上的值按从大到小的顺序排列。

降到k维

注:这里除或不除样本数量n或n-1,其实对求出的特征向量没有影响。

的特征值与特征向量。

注:为什么使用:

降到k维

,当样本数多、样本特征数也多的时候,这个计算还是很大的。当我们用到SVD分解协方差矩阵的时候,SVD有两个好处:

对照就会发现,结果是不一样的。sklearn中的PCA是通过svd_flip函数实现的,sklearn对奇异值分解结果进行了一个处理,因为 ui σi vi=(-ui) σi (-vi) ,也就是u和v同时取反得到的结果是一样的,而这会导致通过PCA降维得到不一样的结果(虽然都是正确的)。具体了解可以自己分析一下sklearn中关于PCA的源码。

对于PCA可以做什么,对应于不同的业务,有不同的使用场景。

例如我最早接触时,用来分析2D人脸的矩阵化后里面的主要成分,提取出关键的维度,使用低维度的矩阵来表示人脸的特征。

当然对应于其他的数据,也是可以使用PCA的,例如在一个向量化好的用户信息矩阵中,需要提取出关键的维度来作为特征描写。所以他的使用场景就类似于他的名字,分析矩阵里面的主要成分,但是维度具体取多少,需要按照自己的数据来计算,也许需要多次的验证。

11 维度

    对于数组和series来说,维度就是shape返回的结果,shape中返回几个数字就是几维。对图像来说,维度就是图像中特征向量的数量。降维算法中的”降维“,指的是降低特征矩阵中特征的数量。

12 sklearn中的降维算法

    sklearn中的降维算法在模块decomposition中,这个模块的本质是一个矩阵分解模块。矩阵分解可以用在降维,深度学习,聚类分析,数据预处理,低纬度特征学习,推荐系统,大数据分析等领域。 SVD和主成分分析PCA都是通过分解特征矩阵来进行降维的 。

13 PCA

    在降维的过程中,将会减少特征的数量,这意味着删除部分数据,数据量变少则表示模型可获取的信息变少了,模型的表现可能会因此受到影响。同时,在高维数据中,必然也有一些特征是不带有效信息的(噪音),或是有一些特征带有的信息和其他一些特征是重复的(一些特征之间可能会线性相关)。我们希望在降维的过程中,既能减少特征的数量又保留大部分有效信息,那就将带有重复信息的特征合并,并删除那些带有无效信息的特征,创建出一个能携带大部分信息,特征更少的特征矩阵。

    在降维中,PCA使用的信息量衡量指标是样本方差,又称可解释性方差,方差越大,特征携带的信息量越多。

    var代表一个特征的方差,n代表样本量,xi代表一个特征中每个样本的取值,xhat代表这一列样本的均值。

14 降维的实现

    步骤3中,我们用来找出n个新特征向量,让数据能够被压缩到少数特征上并且中信息量不损失太多的技术就是矩阵分解,PCA与SVD是两种不同的降维算法,但是都遵从上面的过程来降维,只是两种算法的矩阵分解的方法不同,信息量的衡量指标不同。PCA使用方差作为信息量的衡量指标,并且使用特征值分解来找出空间V。降维时,它会产生协方差矩阵 将特征矩阵分解为以下三个矩阵,其中Q和 是辅助的矩阵, 是一个对角矩阵(除对角线上有值,其他位置都是0的矩阵),其对角线上的元素就是方差,降维完成之后,PCA找到的每个新特征向量就叫做“主成分”,而被丢弃的特征向量被认为信息量很少,这些信息很可能就是噪音。

    SVD使用奇异值分解来找出空间V,其中Σ也是一个对角矩阵,不过它对角线上的元素是奇异值,这也是SVD中用来衡量特征上的信息量的指标。U和V^{T}分别是左奇异矩阵和右奇异矩阵,也都是辅助矩阵。

      在数学原理中,无论是PCA还是SVD都需要遍历所有的特征和样本来计算信息量指标,并且在矩阵分解的过程中,会产生比原来更大的矩阵,比如原数据的结构是(m,n),在矩阵分解中为了找出最佳新特征空间V,可能需要产生(n,n),(m,m)大小的矩阵,还需要产生协方差矩阵去计算更多的信息,因此,降维算法的计算量很大,运行比较缓慢。

       PAC数据特征创造并不属于特征选择,特征选择只是从已经存在的特征中选取携带信息量最多的,选完之后特征依然具有可解释性,仍然能解释改特征在原数据集上的含义。而PCA是将已经存在的特征进行压缩,降维后的特征不是原特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。在新的特征矩阵生成之前,我们无法得知PCA是建立在怎么样的新特征向量上,所以新特征矩阵生成之后不再具有可读性,我们无法判断新特征矩阵的特征是从原数据中的什么特征组合而来,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归),因为无法解释的新特征和标签之间的关系不具有意义。

15 sklearndecompositionPCA

    class sklearndecompositionPCA (n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=00,iterated_power=’auto’, random_state=None)

    n_components就是降维后需要保留的特征数量,即降维流程中第二步里面需要确认的k值,一般输入[0,min(Xshape)]范围中的整数,k的值会影响到模型的表现,如果k值太大,留下的特征太多,达不到降维的效果,如果k值太小,留下的特征太少,那新特征向量可能无法容纳原始数据集中的大部分信息。n_components取值如何选呢?

    a 选择最好的n_components:累积可解释方差贡献率曲线。

    当参数n_components中不填写任何值,则默认返回min(Xshape)个特征,一般来说,样本量都会大于特征数目,所以什么都不填就相当于转换了新特征空间,但没有减少特征的个数。一般来说,不会使用这种输入方式。但我们却可以使用这种输入方式来画出累计可解释方差贡献率曲线,以此选择最好的n_components的整数取值。累计可解释方差贡献率曲线是一天以降维后保留的特征个数为横坐标,降维后新特征捕捉到的可解释方差贡献率为纵坐标的曲线,能帮助我们决定n_components的最好取值

    b最大似然估计自选超参数

    PCA用最大似然估计(maximum likelihoodestimation)自选超参数的方法,输入“mle”作为n_components的参数输入,就可以调用这种方法。

     c按信息量占比选超参数

        输入[0,1]之间的浮点数,并且让参数svd_solver =='full',表示希望降维后的总解释性方差占比大于n_components指定的百分比,即是说,希望保留百分之多少的信息量。比如说,如果我们希望保留97%的信息量,就可以输入n_components = 097,PCA会自动选出能够让保留的信息量超过97%的特征数量

        svd_solver是奇异值分解器的意思,PCA中为什么会有关奇异值分解的参数呢?SVD有一个惊人的数学性质,它能跳过数学神秘宇宙,不计算协方差矩阵,直接找出一个新特征向量组成的n维空间,而这个n维空间就是奇异值分解后的右矩阵 (就是降维过程中所说的生成新特征向量组成的空间V,并非巧合,而特指奇异值分解中的矩阵 )

        右奇异矩阵 有着如下性质:

        k就是n_compoents,是我们降维后希望得到的维度。若X为(m,n)的特征矩阵, 就是结构为(n,n)的矩阵,取这个矩阵的前k行(进行切片),即将V转化为结构是(k,n)的矩阵。而 与原矩阵X相乘,即可得到降维后的特征矩阵X_dr, 这是说,奇异值分解可以不计算协方差矩阵等等结构复杂计算冗长的矩阵,就直接求出新特征空间和降维后的特征矩阵。

        简而言之,SVD在矩阵分解中的过程比PCA简单快速,但是遗憾的是,SVD的信息量衡量指标比较复杂,要理解”奇异值“远不如理解”方差“来得容易,因此,sklearn将降维流程拆分为了两部分,一部分是计算特征空间的V,由奇异值分解完成,另一部分是映射数据和求解新特征矩阵,由主成分分析完成,实现了用SVD的性质减少计算量,却让信息量的评估指标是方差,具体的流程如下图:

16 重要参数 svd_solver与random_state

    参数svd_solver是在降维过程中,用来控制矩阵分解的一些细节的参数。有四种模式可选:"auto", "full", "arpack","randomized",默认”auto"。

    1'auto':基于Xshape和n_compoents的默认策略来选择分解器,如果输入数据的尺寸大于500X500且要提取的特征小于数据最小维度的min(Xshape)的80%,就用效果更高的‘randomized’方法,否则就精确完整的SVD将被计算,截断将会在矩阵被分解完成后有选择的发生。

    2‘full’:从scipylinalgsvd中调用标准的LAPACK分解器来生成精确完整的SVD,适合数据量比较适中,计算时间充足的情况,生成的精确完整的SVD的结构为:

    3‘arpack’:从scipysparselinalgsvds调用ARPACK分解器来运行截断奇异值分解(SVD truncated),分解时就将特征数量降到n_components中输入的数值k,可以加快运算速度,适合特征矩阵很大的时候,但一般用于特征矩阵为稀疏矩阵的情况,此过程包含一定的随机性。截断后的SVD分解出的结构为:

     4‘randomized’:通过Halko等人的随机方法进行随机SVD。在"full"方法中,分解器会根据原始数据和输入的n_components值去计算和寻找符合需求的新特征向量,但是在"randomized"方法中,分解器会先生成多个随机向量,然后一一去检测这些随机向量中是否有任何一个符合我们的分解需求,如果符合,就保留这个随机向量,并基于这个随机向量来构建后续的向量空间。这个方法已经被Halko等人证明,比"full"模式下计算快很多,并且还能够保证模型运行效果。适合特征矩阵巨大,计算量庞大的情况。

    而参数random_state在参数svd_solver的值为"arpack" or "randomized"的时候生效,可以控制这两种SVD模式中的随机模式。通常我们就选用”auto“,不必对这个参数纠结太多。

主成分分析(Principal components analysis,以下简称PCA) 是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。它可以通过 线性变换 将原始数据变换为一组 各维度线性无关 的表示,以此来提取数据的主要线性分量。需要注意的是,PCA一般只用于线性数据降维,对于非线性数据一般采用KPCA。

降维就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据,并且希望损失尽可能的小。首先看几张图,有一个直观的认识。
这里面,把椭圆看成是数据:

基于这个知识,如果我们想对数据进行降维的话,比如图1的两个维度的数据降成一维,我们可以选择保留X1这个维度的数据,因为在这个维度上蕴含的信息量更多。同理,图2就可以保留x2这个维度的数据。但是,问题来了,图3应该保留哪个维度的数据呢?答案是保留哪个维度都不好,都会丢失较大的信息量。但是,如果我们把图3的坐标轴旋转一下

比较容易看出,图3在新的坐标轴下就能进行降维了。
所以,第一,变换正确的坐标轴(基);第二,保留方差最大的几个轴作为主成分,这样的做法就是PCA的核心思想。

从前文可以看出,理想的坐标轴是要求数据投在新坐标轴后,尽可能的分散,也就是数据的方差最大。然后每次选择方差最大的轴作为主成分。
将前文2维降1维的例子扩展到更高维度,还有一个问题需要解决,考虑三维降到二维问题。与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因为发生了大量的信息重复,起不到降维的作用,因此,应该有其他约束条件——就是正交。 PCA要求轴与轴之间是正交的,也就是不同维度的信息相关性为0。

在表示相关性中,相关系数与协方差是等价的,这里为了方便计算,使用协方差。下面是协方差公式,当协方差为0时,表示两个特征a,b线性不相关。

可以发现,当a=b时,协方差公式就变成了方差公式,方差是特殊的协方差。如果运气更好,特征a与b的平均数都为0,那么公式会进一步简化,得到:

所以说,为了计算方便,PCA降维前,一般都要求将所有特征属性中心化,即平均数为0。

因为PCA要求,同一轴内方差最大,不同轴协方差为0,如何把它们放在一块呢?这里就引入了协方差矩阵的概念:
假设有m个样本,每个样本特征维度是2,每个特征都经过中心化处理:

我们发现协方差矩阵的对角线是方差,而且是对称矩阵。方差和协方差都放在了一个矩阵里面,只需对这个矩阵优化,使它除了对角线的其余元素都为0,就可以了,美滋滋。

我们知道矩阵乘法,本质上就是一种线性变换的过程。而正交基矩阵的乘法,则是坐标系变换的过程。设原空间的数据为X,协方差矩阵为C,经过正交基矩阵P,得到了新坐标系下的数据Y,即Y=PX。那么新坐标系下的协方差矩阵D是怎样的呢?

我们发现,新旧空间的协方差矩阵是有关系的,而且都和变换矩阵P有关系。问题就转化成了,能不能找到一个矩阵P,使得新空间下的协方差矩阵的非对角线元素都为0

首先,原始数据矩阵X的协方差矩阵C是一个实对称矩阵,它有特殊的数学性质:

也就是说,P就是是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是C的一个特征向量。 如果设P按照中特征值的从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y
其实,经过数学上的推导的,我们就可以知道,特征值对应的特征向量就是理想中想取得正确的坐标轴,而特征值就等于数据在旋转之后的坐标上对应维度上的方差。

由于协方差矩阵的维度和特征相同,所以在进行特征值分解时,得到的特征值数目不会超过特征的数目。

在学习线性代数时,我们都会学矩阵的特征值分解,我们知道一个方阵A经过 特征值分解 后就得到 特征向量 特征值 了。那么,这个所谓的特征值和特征向量到底是什么东西呢?
很多人都会说是那个经典的式子:

首先给出概念上的一种解释。所谓的特征值和特征向量,最重要的是理解“特征”这两个字,特征向量翻译为eigen vector, eigen这个单词来自德语,本义是在“本身固有的,本质的”。纯数学的定义下,并不能很明白地理解到底为什么叫做特征值和特征向量。但是举一个应用例子,可能就容易理解多了。

在图像处理中,有一种方法就是特征值分解。我们都知道图像其实就是一个像素值组成的矩阵,假设有一个100x100的图像, 对这个图像矩阵做特征值分解,其实是在提取这个图像中的特征,这些提取出来的特征是一个个的向量,即对应着特征向量。而这些特征在图像中到底有多重要,这个重要性则通过特征值来表示。 比如这个100x100的图像矩阵A分解之后,会得到一个100x100的特征向量组成的矩阵Q,以及一个100x100的只有对角线上的元素不为0的矩阵E,这个矩阵E对角线上的元素就是特征值,而且还是按照从大到小排列的(取模,对于单个数来说,其实就是取绝对值),也就是说这个图像A提取出来了100个特征,这100个特征的重要性由100个数字来表示,这100个数字存放在对角矩阵E中。 在实际中我们发现,提取出来的这100个特征从他们的特征值大小来看,大部分只有前20(这个20不一定,有的是10,有的是30或者更多)个特征对应的特征值很大,后面的就都是接近0了,也就是说后面的那些特征对图像的贡献几乎可以忽略不计。

我们知道,图像矩阵 A 特征值分解后可以得到矩阵 P 和矩阵 E (特征值对角矩阵):

我们可以看到,在只取前20个特征值和特征向量对图像进行恢复的时候,基本上已经可以看到图像的大体轮廓了,而取到前50的时候,几乎已经和原图像无异了。明白了吧,这就是所谓的矩阵的特征向量和特征值的作用。

所以归根结底,特征向量其实反应的是矩阵A本身固有的一些特征,本来一个矩阵就是一个线性变换,当把这个矩阵作用于一个向量的时候,通常情况绝大部分向量都会被这个矩阵A变换得“面目全非”,但是偏偏刚好存在这么一些向量,被矩阵A变换之后居然还能保持原来的样子,于是这些向量就可以作为矩阵的核心代表了。于是我们可以说:一个变换(即一个矩阵)可以由其特征值和特征向量完全表述,这是因为从数学上看,这个矩阵所有的特征向量组成了这个向量空间的一组基底。而矩阵作为变换的本质其实不就把一个基底下的东西变换到另一个基底表示的空间中么?

参考:
>

主成分分析(Principal Component Analysis,PCA)是非常经典的降维算法,属于无监督降维,做机器学习的应该都有所了解。但是,除了基本的PCA推导和应用之外,还有SparsePCA、KernelPCA、TruncatedSVD等等,另外PCA和特征值、奇异值的关系以及SparsePCA和字典学习(Dict Learning,Lasso)的关系等等,也是比较有趣的事情。

PCA是一种线性的降维方法,并且是利用 正交变换 作为映射矩阵,主要步骤是:对于一个高维空间的数据样本 ,利用正交矩阵 将样本映射到低维空间 ,其中d<<n 起到了降维的作用。

那么PCA该如何选择矩阵 A_{nd}呢?

1为什么要最大方差?

考虑下面数据样本为二维的情形,即n = 2,在Figure 1中,数据样本呈现椭圆分布,我们现在要把二维降为一维d = 1,相当于是选择一个单位向量 ,将 所有的数据点投影到这个向量上来,如图中所示,画出的四个红色带箭头的线条代表的是候选向量,那么要选哪一个作为最优的呢?

PCA的假设偏好是:数据在低维空间越分散越好。假设我们选择了上图中朝向为左上方的向量,那么将数据点全部投影到这个方向上面,那么就会导致数据点都“拥挤”在了一起,对后续分类或其它任务造成了很不友好的影响。所以,PCA选的是图中朝向右上方比较粗的那个作为最合适的 [上传失败(image-8aef14-1586173690384)] ,这样得到的映射后的数据点很分散,对后续任务有利。

我们想要最大化方差,通过一个单位向量w使得投影到这个向量的值方差最大,达到分散的效果。(选择单位向量的原因是我们只关心其方向,并不关心其大小。

其中 。

其中投影数据的方差:

其中S是数据的协方差矩阵,定义为

想要投影数据的方差最大,必须对 增加限制,这里的限制就是 为单位向量。

通过引入拉格朗日方法:

上式对 求导后得到:

这表明 是S的一个特征向量,如果上式左乘 得到

上式中可以看出,方差的值为特征值,当 为特征值 对应的特征向量。想要最大时,需要 最大。

PCA的应用:

1数据压缩

2数据预处理

3数据可视化

可以先通过采样方式,计算采样矩阵的的特征值和特征向量。用采样矩阵的特征值和特征向量还原原矩阵。

引入潜在变量z,对应主成分的子空间,其服从高斯分布。z的先验分布时服从标准正态分布。

同样以潜在变量z为条件,观测变量x的条件概率服从正态分布

我们可以从生成式的观点来看概率PCA模型,具体来说就是D维观测变量x 由M维潜在变量z的一个线性变换,附加一个高斯噪声来获得。即

其中 是一个D维0均值高斯分布的噪声变量,协方差为 。

其中

对似然函数求导,得到

带到上式中得到:

其中S为协方差矩阵。

之后通过EM算法来求解W矩阵。

由于PCA时线性变换,往往具有较大的局限性。在SVM中 使用核方法来替换标量积,将这种方法应用到PCA中,得到一个非线形的推广。

考虑之前的推导结果:

其中x进行0均值标准化,那么

考虑到一个M维特征空间的一个非线性变换 , 将每个数据点 投影到 上,我们可以得到特征空间的协方差矩阵为:

特征向量展开为:

这样我们可以得到C的特征向量是由 , 组成的。

用核函数 来表示,带入上式,左右两端同时乘以 可以得到

用矩阵形式来表示为:

同时去掉一个K

求解下面的特征值方程:

下一步我们只要求出K即可。

经过推导可以得到

可以根据K求出特征向量

下一节中将讲解求解PCA的另一个视角SVD。

reference:

3 >给个程序你参考哈
X为输入矩阵
[Xrow, Xcol] = size(X); % Xrow:样本个数 Xcol:样本属性个数
%% 数据预处理,进行标准化出理,处理后均值为0方差为1
Xc = repmat(mean(X), [Xrow,1,1]); % 求原始数据的均值
Xe = repmat(std(X), [Xrow,1,1]); % 求原始数据的标准差
X0 = (X - Xc) / Xe; % 标准阵X0,标准化为均值0,方差1;
%% 求标准化矩阵的协方差矩阵
sigma = cov(X0);
%% 特征值分解
[V, D] = eig(sigma); % 求协方差矩阵的特征向量(V)和特征值(D)
lmda = diag(D); % 将主对角线上为特征值的对角阵变换成特征值列向量
[Dt, index] = sort(lmda, 'descend'); % 特征值按降序排列,Dt是排列后的数组,index是序号
%% 根据累积主元贡献率选取主元个数
npc = 1;
while sum(Dt(1:npc)) / sum(Dt) < 085
npc = npc + 1;
end
%% 计算负荷向量
P_all = V(:, index); % 全部负荷
P_pcs = P_all(:, 1:npc); % 主元负荷
%% 构建主元对角阵
Lambda = diag(Dt(1:npc));
%% 计算得分向量
t_all = X0 P_all; % 全部得分
t_pcs = t_all(:, 1:npc); % 主元得分


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/13368077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-23
下一篇 2023-07-23

发表评论

登录后才能评论

评论列表(0条)

保存