pca 订阅
大脑后动脉:起自基底动脉皮层支供应枕叶、颞叶底部深穿支供应脑干、丘脑、海马、膝状体 展开全文
大脑后动脉:起自基底动脉皮层支供应枕叶、颞叶底部深穿支供应脑干、丘脑、海马、膝状体
信息
病    情
锥体外系症状
后    果
闭塞时引起枕叶皮层闭塞
中文名
大脑后动脉
基    础
起自基底动脉
nat功能
大脑后动脉:起自基底动脉皮层支供应枕叶、颞叶底部深穿支供应脑干、丘脑、海马、膝状体闭塞时引起枕叶皮层闭塞,可有对侧偏盲(黄斑回避);中央支闭塞可导致丘脑梗塞,表现为丘脑综合征:对侧偏身感觉减退,感觉异常和丘脑性疼痛和锥体外系症状。主干闭塞引起对侧同向性偏盲,上部视野损伤较重,黄斑视力可不受累(黄斑视觉皮质代表区为大脑中、后动脉双重血液供应)。中脑水平大脑后动脉起始处闭塞,可见垂直性凝视麻痹、动眼神经瘫、核件性眼肌麻痹、眼球垂直性歪扭斜视。优势半球枕叶受累可出现命名性失语、失读,不伴失写。双侧大脑后动脉闭塞导致的皮质盲、记忆受损(累及颞叶),不能识别熟悉面孔(面容失认症),幻视和行为综合征。深穿支闭塞:丘脑穿通动脉产生红核丘脑综合征:病侧小脑性共济失调、意向性震颤、舞蹈样不自主运动,对侧感觉障碍;丘脑膝状体动脉出现丘脑综合征:对侧深感觉障碍、自发性疼痛、感觉过度、轻偏瘫、共济失调和舞蹈-手足徐动症等。
收起全文
精华内容
下载资源
问答
  • PCA

    千次阅读 2016-08-27 22:22:41
    PCA

    1、PCA为何要用协方差矩阵

    http://blog.csdn.net/babywong/article/details/50085239

    2、主成分分析PCA

    http://www.cnblogs.com/zhangchaoyang/articles/2222048.html

    3、PCA的数学原理(非常值得阅读)!!!!

    http://blog.csdn.net/xiaojidan2011/article/details/11595869

    4、UFLDL 主成分分析

    http://ufldl.stanford.edu/wiki/index.php/主成分分析

    展开全文
  • PCA

    2018-02-08 10:57:13
    PCA简介
    PCA简介

    展开全文
  • PCA原理

    万次阅读 多人点赞 2019-05-31 10:10:31
    PCA 各位,久违了~ 什么是PCA? 什么是PCA呢?这是一个问题,什么样的问题?简单而又复杂的问题,简单是因为百度一下就会出现一大堆的解释,复杂是因为它里面蕴含的内容还是很多的,值得我们仔细研究研究。 PCA 取...

    PCA

    各位,久违了~

    什么是PCA?

    什么是PCA呢?这是一个问题,什么样的问题?简单而又复杂的问题,简单是因为百度一下就会出现一大堆的解释,复杂是因为它里面蕴含的内容还是很多的,值得我们仔细研究研究。

    PCA 取自其英文的三个单词的首字母:Principle component analysis。中文名字:主成分分析。恐怕大家很早就知道PCA是个什么东东,并且还用过matlab、python、C++等语言的各类机器学习算法包中的PCA函数进行数据处理。即便是没有自己写过这个PCA的程序可能也看过好多博客告诉我们:首先预处理数据,然后计算矩阵X的协防差阵。然后计算协防差阵的特征值和特征向量,最后根据特征值和特征向量建立一个映射矩阵…吧喇叭啦,一大堆的东西。然后感觉用编程实现这个过程应该也不是很难吧,然后就觉得自己会了PCA了,哈哈。

    坦白说,上面是我的经历,并不是别人的经历,所以很惭愧,这个经历并不是很好,说实话,经过上面的经历我其实还是不知道什么是主成分分析,PCA对我来讲只是一个名字而已。但是为什么今天要写这篇文章呢?这是有原因的,因为之前看视频的时候发现视频中老师在讲PCA,重要的是老师不单单讲计算过程,而且讲了其中的原理。遗憾的是当时没听懂,也可能是当时睡着了,管他呢。最近写东西的时候遇到了和这个PCA相关的AutoEncoder,和学长交流的时候学长非常耐心地回答了我各种疑问,然后我知道了有AutoEncoder这个东西的存在,因为在这之前,我一直在考虑PCA。我靠,又跑题了,回归问题:什么是PCA? 如果想记住这个名字的话很容易:三个字母PCA,po ci a 。如果想知道具体的内容和原理,往下看,当然,书本上,视频里都有,只不过我不能保证比下面的内容有趣。

    PCA 用来干什么?

    PCA呀,用来做什么呢?这个很重要,PCA也有很多应用,可能我们之前听过用PCA做人脸识别,PCA做异常检测等等。但事实上PCA没有那么强大的功能,PCA能做的事其实很有限,那就是:降维。其他拓展应用都是在这基础上做了相应额工作。为什要降维呢?很明显,数据中有些内容没有价值,这些内容的存在会影响算法的性能,和准确性。

    如上图,数据点大部分都分布在x2方向上,在x1方向上的取值近似相同,那么对于有些问题就可以直接将x1坐标的数值去掉,只取x2坐标的值即可。但是有些情况不能直接这样取,例如:

    上图的数据分布在x1和x2方向都比较均匀,任一去掉一个坐标的数值可能对结果都会有很大的影响。这个时候就是PCA展现作用的时候了。黑色坐标系是原始坐标系,红色坐表系是我后面构建的坐标系,如果我的坐标系是红色的,那么这个问题是不是就和上面那个问题一样了,我只需要去掉y2坐标系的数据即可。实际上黑色坐标系和红色坐标系是等价的,差异仅仅是在空间中他们的基不同,黑色坐标系的基是我们最习惯的(1, 0), (0, 1),红色坐标系的基是(1, 1),(-1, -1),事实上,他们是等价的,只不过经常默认使用的就是黑色坐标系。主成分分析可以让数据的投影到那些数据分布比较分散的平面上,比如上图的y1,从而忽视y2的作用,进而达到降维的目的。

    PCA 数学原理

    为了达到目的,可以不择手段

    上面我们说PCA可以将数据投影到分布分散的平面内,而忽略掉分布集中的平面。我们可以这样理解,如上面的图2,大部分数据投影到y1坐标系中的化,数据分布会比较分散,投影到x1、x2等其他坐标轴分布会相对集中,其中,投影到y2上面分布最集中。所以我们尽可能将数据转化到红色坐标系,然后去掉y2坐标。好了,问题描述完了,该想象怎样才能达到这样的目的。

    任何形式的变化在数学上都可以抽象成一个映射,或者函数。好,现在我们需要构建一个函数f(Xm×n)f(X_{m\times n})使得这个函数可以将矩阵Xm×nX_{m\times n}降维,矩阵XX是原始数据,矩阵的每一行是一个样本的特征向量,即矩阵Xm×nX_{m\times n}中有m个样本,每个样本有n个特征值。所以,所谓的降维,其实是减少n的数量。
    假设降维后的结构为Zm×kZ_{m \times k},其中k<nk < n
    那么PCA的数学表达可以这样表示:
    Zm×k=f(Xm×n),k<nZ_{m\times k} = f(X_{m\times n}), k < n

    这里可能比较抽象,我尽量说得有趣:

    开始数学了,手段是数学

    为了找到上面说的f(x)f(x)我们需要做一些工作,在线性空间中,矩阵可以表示为一种映射,所以上面的问题可以转化为寻找这样一个矩阵WW,该矩阵可以实现上面的映射目的:
    Zm×k=Xm×nWn×kZ_{m\times k} = X_{m\times n}W_{n\times k}
    都进行转秩吧,看着舒服,一般映射是放在左边的:

    Zk×m=Wk×nXn×mZ_{k\times m} = W_{k\times n}X_{n\times m}

    现在假设我们要把矩阵的维数降为1,也就是最后每个样本只有一个属性,即k=1k=1
    目标是使降维后的数据在那个坐标轴中的分布尽可能分散,数据的分布的离散程度我们用方差来衡量。
    现在我们的目标:
    z=wxz=wx

    最大化新坐标轴上的方差,就是让数据更加分散:
    maxw1mim(zizˉ)2s.t.    W2=1\max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(z_i - \bar{z})^2 \newline s.t. \ \ \ \ \lVert W \rVert_2 = 1

    将上面的优化问题转化一下:
    maxw1mim(zizˉ)2=maxw1mim(wxiwxˉ)2=maxw1mim(w(xixˉ))(w(xixˉ))T=maxw1mim(w(xixˉ)(xixˉ)TwT)T=maxw1mwim(xixˉ)(xixˉ)TwTmaxw1mwCov(x)wT \max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(z_i - \bar{z})^2 \newline = \max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(wx_i - w\bar{x})^2 \newline = \max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(w(x_i - \bar{x}))(w(x_i - \bar{x}))^T \newline = \max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(w(x_i - \bar{x})(x_i - \bar{x})^Tw^T)^T \newline = \max\limits_{w}\frac{1}{m}w\sum\limits_{i}^{m}(x_i - \bar{x})(x_i - \bar{x})^Tw^T \newline \max\limits_{w}\frac{1}{m}wCov(x)w^T

    最终的目标转化为:
    maxw1mwCov(x)wTs.t.  w2=1\max\limits_{w}\frac{1}{m}wCov(x)w^T \newline s.t. \ \ \lVert w\rVert _2 = 1
    Cov(x)Cov(x)是矩阵xx的协防差阵。
    利用lagrange multiplier 方法求解上面问题

    L=maxw1mwCov(x)wT+α(w21)=maxw1mwCov(x)wT+α(wTw1)L = \max\limits_{w}\frac{1}{m}wCov(x)w^T + \alpha (\lVert w \rVert _2 -1 )\newline = \max\limits_{w}\frac{1}{m}wCov(x)w^T + \alpha (w^Tw - 1)
    这里解释一下为什么要限制w2=1\lVert w \rVert_2 = 1,如果不这样限制,那么问题
    maxw1mwCov(x)wTs.t.  w2=1\max\limits_{w}\frac{1}{m}wCov(x)w^T \newline s.t. \ \ \lVert w\rVert _2 = 1
    直接取w=(,,...,)w = (\infty, \infty, ..., \infty)即可满足最大,那这样没有任何意义,所以这个限制条件是非常有用的。

    通过求解 Lagrange 函数,得到结果为
    Cov(x)wαw=0Cov(x)w - \alpha w = 0

    Cov(x)=SCov(x) = SSwαw=0Sw - \alpha w = 0正好是特征值的定义,也就是α\alpha是矩阵SS的特征值,ww是矩阵SS的特征向量。但是特征值那么多,ww到底是那个特征值呢?
    maxw1mwSwT=maxwwTSTw=maxwwTαw=αmaxwwTw=α\max\limits_{w}\frac{1}{m}wSw^T \newline = \max\limits_{w}w^TS^Tw \newline = \max\limits_{w}w^T\alpha w \newline = \alpha \max\limits_{w}w^Tw \newline = \alpha

    所以,要想最大化那个问题,就需要找到最大特征值。
    同样道理,如果是需要将数据映射为2维数据,还是求解上述的最大化方差,但是需要加一个约束条件:w1w2=0w_1\cdot w_2 = 0,同样的思路,最终求解出w2w_2是第二大特征值对应的特征向量。更高维的计算以此类推。

    经过上面一番推理,我们知道了PCA的原理,但是要记住PCA用途很广,但需要记住不是什么时候都可以用到PCA的,由证明过程我们知道PCA其实是有很多限制的。比如,可以做PCA降维的前提必须保证数据是线性分布的,如果数据不是线性的,比如下图这样的

    数据分布不是线性的,用PCA效果可能就不会很理想。

    PCA 用编程实现的流程

    经过上面原理的推倒我们可以总结一下,真正进行PCA实际操作的时候都要经过哪些步骤?

    1. 整理原始矩阵Xm×nX_{m\times n}
    2. 求原始矩阵Xm×nX_{m \times n}的协防差阵Sm×m=Cov(X)S_{m\times m}=Cov(X)
    3. 求解协防差阵的特征值和特征向量。
    4. 选取最大的KK(人为给定)个特征值所对应的特征向量组成构成矩阵Wn×kW_{n\times k}
    5. 直接进行矩阵计算Zm×k=Xm×nWn×kZ_{m\times k} = X_{m\times n}W_{n\times k}

    流程很明确,那具体的编程要怎么做呢?难点在哪?

    难点1:协防差矩阵的计算

    假设原始矩阵为Xm×nX_{m\times n},原始矩阵的各个属性的均值向量为Xˉ\bar{X}
    协防差距阵的计算如下:
    Cov(X)=1m(XXˉ)T(XXˉ)Cov(X) = \frac{1}{m}(X-\bar{X})^T(X-\bar{X})
    这样用程序就非常好实现了。

    难点2:特征值和特征向量的求解

    特征值和特征向量这里的内容比较多,虽然有很多算法可以计算特征值和特征向量,但是其背后的数学原理着实有点复杂,记得有本书叫矩阵论,特征值和特征向量的计算方法和原理都可以在上面找到,惭愧的是,我也搞不懂。听说有什么QR算法、Jocobi方法、SVD等,似乎是一些矩阵分解的理论。这个还需要再好好学学才能继续吹牛,所以现在不能随便吹。

    PCA等价于只包含一个隐层的神经网络

    李宏毅老师的视频里用另外一种视角解释PCA,但是我觉得还是没有听明白,具体的关系,我觉得是老师没讲明白,其中最难以理解的就是xxˉx-\bar{x}x^\hat{x}计算重构误差,为什么??

    所以这个理论还有待挖掘。

    PCA和AutoEncoder的关系

    1. PCA限制多,要求数据是线性分布的,AutoEncoder可以解决非线性降维问题
      《Reducing the Dimensionality of Data with Neural Networks》这篇论文中有详细介绍:
      下面是论文中实验的结果:

    同样的数据,第一个图是PCA降维到2-D平面上的结果,第二个图是AutoEncoder降维到2-D平面上的结果。从结果中也可以明显的看出AutoEncoder降维后对数据的分布仍然有明显的区分,而PCA的结果却有点令人失望,好象是揉成了一团。

    1. PCA理论基础更强,AutoEncoder可解释性差
      AutoEncoder通过挖掘潜在特性提高模型性能,但这些模糊的特性或许会对知识发现的结果产生不良影响。

    2. PCA计算速度更快,AutoEncoder好不好,需要做实验验证

    参考资料:

    1. 李宏毅机器学习:PCA
    2. Reducing the Dimensionality of Data with Neural Networks

    掌管天堂的空之王者,于地狱唱响容光之歌!

    展开全文
  • 主成分分析(PCA)原理详解

    万次阅读 多人点赞 2018-06-09 15:08:25
    “微信公众号”本文同步更新在我的微信公众号里,地址:https://mp.weixin.qq.com/s/Xt1vLQfB20rTmtLjiLsmww本文同步更新在我的知乎专栏里面:主成分分析(PCA)原理详解 - Microstrong的文章 - 知乎...

    “微信公众号”

    1.相关背景

    在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下,许多变量之间可能存在相关性,从而增加了问题分析的复杂性。如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。

    因此需要找到一种合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。主成分分析与因子分析就属于这类降维算法。

    2. 数据降维

    降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。

    降维具有如下一些优点:

    • 1) 使得数据集更易使用。
    • 2) 降低算法的计算开销。
    • 3) 去除噪声。
    • 4) 使得结果容易理解。

    降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。

    3. PCA原理详解

    3.1 PCA的概念

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

    思考:我们如何得到这些包含最大差异性的主成分方向呢?

    答案:事实上,通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。

    由于得到协方差矩阵的特征值特征向量有两种方法:特征值分解协方差矩阵、奇异值分解协方差矩阵,所以PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法。

    既然提到协方差矩阵,那么就简单介绍一下方差和协方差的关系。然后概括介绍一下特征值分解矩阵原理、奇异值分解矩阵的原理。概括介绍是因为在我之前的《机器学习中SVD总结》文章中已经详细介绍了特征值分解原理和奇异值分解原理,这里就不再重复讲解了。可以看我的

    《机器学习中SVD总结》文章。地址:机器学习中SVD总结

    3.2 协方差和散度矩阵

    样本均值:

    样本方差:


    样本X和样本Y的协方差:

    由上面的公式,我们可以得到以下结论:

    (1) 方差的计算公式是针对一维特征,即针对同一特征不同样本的取值来进行计算得到;而协方差则必须要求至少满足二维特征;方差是协方差的特殊情况。

    (2) 方差和协方差的除数是n-1,这是为了得到方差和协方差的无偏估计。

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

    散度矩阵定义为:

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

    3.3 特征值分解矩阵原理

    (1) 特征值与特征向量

    如果一个向量v是矩阵A的特征向量,将一定可以表示成下面的形式:

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

    (2) 特征值分解矩阵

    对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:


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

    具体了解这一部分内容看我的《机器学习中SVD总结》文章。地址:机器学习中SVD总结

    3.4 SVD分解矩阵原理

    奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:

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

    SVD分解矩阵A的步骤:

    (1) 求的特征值和特征向量,用单位化的特征向量构成 U。

    (2) 求的特征值和特征向量,用单位化的特征向量构成 V。

    (3) 将或者的特征值求平方根,然后构成 Σ。

    具体了解这一部分内容看我的《机器学习中SVD总结》文章。地址:机器学习中SVD总结

    3.5 PCA算法两种实现方法

    (1) 基于特征值分解协方差矩阵实现PCA算法

    输入:数据集,需要降到k维。

    1) 去平均值(即去中心化),即每一位特征减去各自的平均值。、

    2) 计算协方差矩阵,注:这里除或不除样本数量n或n-1,其实对求出的特征向量没有影响。

    3) 用特征值分解方法求协方差矩阵的特征值与特征向量。

    4) 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P。

    5) 将数据转换到k个特征向量构建的新空间中,即Y=PX。

    总结:

    1)关于这一部分为什么用,这里面含有很复杂的线性代数理论推导,想了解具体细节的可以看下面这篇文章。

    CodingLabs - PCA的数学原理

    2)关于为什么用特征值分解矩阵,是因为 是方阵,能很轻松的求出特征值与特征向量。当然,用奇异值分解也可以,是求特征值与特征向量的另一种方法。

    举个例子:


    以X为例,我们用PCA方法将这两行数据降到一行。

    1)因为X矩阵的每行已经是零均值,所以不需要去平均值。

    2)求协方差矩阵:

    3)求协方差矩阵的特征值与特征向量。

    求解后的特征值为:

    对应的特征向量为:


    其中对应的特征向量分别是一个通解,可以取任意实数。那么标准化后的特征向量为:


    4)矩阵P为:


    5)最后我们用P的第一行乘以数据矩阵X,就得到了降维后的表示:


    结果如图1所示:


                                                                                        图1:数据矩阵X降维投影结果

    注意:如果我们通过特征值分解协方差矩阵,那么我们只能得到一个方向的PCA降维。这个方向就是对数据矩阵X从行(或列)方向上压缩降维。

    (2) 基于SVD分解协方差矩阵实现PCA算法

    输入:数据集,需要降到k维。

    1) 去平均值,即每一位特征减去各自的平均值。

    2) 计算协方差矩阵。

    3) 通过SVD计算协方差矩阵的特征值与特征向量。

    4) 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。

    5) 将数据转换到k个特征向量构建的新空间中。

    在PCA降维中,我们需要找到样本协方差矩阵的最大k个特征向量,然后用这最大的k个特征向量组成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵,当样本数多、样本特征数也多的时候,这个计算还是很大的。当我们用到SVD分解协方差矩阵的时候,SVD有两个好处:

    1) 有一些SVD的实现算法可以先不求出协方差矩阵也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解而是通过SVD来完成,这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是特征值分解。

    2)注意到PCA仅仅使用了我们SVD的左奇异矩阵,没有使用到右奇异值矩阵,那么右奇异值矩阵有什么用呢?

    假设我们的样本是m*n的矩阵X,如果我们通过SVD找到了矩阵最大的k个特征向量组成的k*n的矩阵 ,则我们可以做如下处理:


    可以得到一个m*k的矩阵X',这个矩阵和我们原来m*n的矩阵X相比,列数从n减到了k,可见对列数进行了压缩。也就是说,左奇异矩阵可以用于对行数的压缩;右奇异矩阵可以用于对列(即特征维度)的压缩。这就是我们用SVD分解协方差矩阵实现PCA可以得到两个方向的PCA降维(即行和列两个方向)。

    4. PCA实例

    (1)PCA的Python实现:

    ##Python实现PCA
    import numpy as np
    def pca(X,k):#k is the components you want
      #mean of each feature
      n_samples, n_features = X.shape
      mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
      #normalization
      norm_X=X-mean
      #scatter matrix
      scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
      #Calculate the eigenvectors and eigenvalues
      eig_val, eig_vec = np.linalg.eig(scatter_matrix)
      eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
      # sort eig_vec based on eig_val from highest to lowest
      eig_pairs.sort(reverse=True)
      # select the top k eig_vec
      feature=np.array([ele[1] for ele in eig_pairs[:k]])
      #get new data
      data=np.dot(norm_X,np.transpose(feature))
      return data
    
    X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    
    print(pca(X,1))

    上面代码实现了对数据X进行特征的降维。结果如下:

    (2)用sklearn的PCA与我们的PCA做个比较:

    ##用sklearn的PCA
    from sklearn.decomposition import PCA
    import numpy as np
    X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    pca=PCA(n_components=1)pca.fit(X)
    print(pca.transform(X))

    结果如下:

    搞了半天结果不是很一样啊!分析一下吧!

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

    5. PCA的理论推导

    PCA有两种通俗易懂的解释:(1)最大方差理论;(2)最小化降维造成的损失。这两个思路都能推导出同样的结果。

    我在这里只介绍最大方差理论:

    在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。样本在u1上的投影方差较大,在u2上的投影方差较小,那么可认为u2上的投影是由噪声引起的。

    因此我们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。

    比如我们将下图中的5个点投影到某一维上,这里用一条过原点的直线表示(数据已经中心化):

    假设我们选择两条不同的直线做投影,那么左右两条中哪个好呢?根据我们之前的方差最大化理论,左边的好,因为投影后的样本点之间方差最大(也可以说是投影的绝对值之和最大)。

    计算投影的方法见下图:


    图中,红色点表示样例,蓝色点表示在u上的投影,u是直线的斜率也是直线的方向向量,而且是单位向量。蓝色点是在u上的投影点,离原点的距离是<x,u>(即或者)。

    6. 选择降维后的维度K(主成分的个数)

    如何选择主成分个数K呢?先来定义两个概念:


    选择不同的K值,然后用下面的式子不断计算,选取能够满足下列式子条件的最小K值即可。

    其中t值可以由自己定,比如t值取0.01,则代表了该PCA算法保留了99%的主要信息。当你觉得误差需要更小,你可以把t值设置的更小。上式还可以用SVD分解时产生的S矩阵来表示,如下面的式子:


    Reference:

    (1) 主成分分析(PCA)原理详解

    http://blog.csdn.net/zhongkelee/article/details/44064401

    (2) 机器学习之PCA主成分分析 - steed灬 - 博客园

    https://www.cnblogs.com/steed/p/7454329.html

    (3) 简单易学的机器学习算法——主成分分析(PCA)

    https://blog.csdn.net/google19890102/article/details/27969459

    (4) 机器学习实战之PCA - 笨鸟多学 - 博客园

    https://www.cnblogs.com/zy230530/p/7074215.html

    (5) 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用 - LeftNotEasy - 博客园

    http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html

    (6) 从PCA和SVD的关系拾遗

    https://blog.csdn.net/Dark_Scope/article/details/53150883

    (7) CodingLabs - PCA的数学原理

    http://blog.codinglabs.org/articles/pca-tutorial.html

    (8) PCA(主成分分析)python实现

    https://www.jianshu.com/p/4528aaa6dc48

    (9) 主成分分析PCA(Principal Component Analysis)在sklearn中的应用及部分源码分析

    https://www.cnblogs.com/lochan/p/7001907.html

    展开全文
  • pca

    2013-11-20 20:09:31
    opencv中PCA有现成的方法,具体代码如下(我的风格是先给出代码,在代码中介绍实现逻辑) #include #include #include #include using namespace cv; using namespace std; //将给出的图像回归为值域在0...
  • PCA原理分析和Matlab实现方法(三)

    万次阅读 多人点赞 2017-03-30 17:03:19
    PCA主成分分析原理分析和Matlab实现方法(三) PCA算法主要用于降维,就是将样本数据从高维空间投影到低维空间中,并尽可能的在低维空间中表示原始数据。PCA的几何意义可简单解释为: 0维-PCA:将所有样本信息都...
  • PCA 实现点云粗配准

    万次阅读 2021-04-03 18:31:32
    python版本的主成分分析(PCA)实现点云粗配准

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,418
精华内容 9,367
关键字:

pca