PCA在作数据处理,通常会有一个数据预处理,其中一个目标就是将取数据特征向相关性。 html
为何要去特征的相关性? 函数
由于数据若是有相关性,在学习的时候是冗余的,徒增学习成本;因此对于数据处理(也称之为白化,英文有的时候称之为sphering),白化的目的:1.实现特征之间的相关性较低;2.全部的特征具备相同的方差。 学习
怎么去特征相关性,就是让他们的协方差为0,协方差,顾名思义,就是两组变量的协同性,若是两个变量的变化趋势是一致的,某个变量范围内,取值一样趋于增大、减小,这个时候,协方差就是正常,若是变化趋势相反,协方差就是正直;那么若是两个变量(函数)的变化趋势无关,协方差取值是0. url
若是:E(X)=m,E(Y)=v,协方差公式以下: spa
cov(X,Y) = E((X-m)(Y-v)) = E(X*Y) - mv .net
若是E(X)和E(Y)二者独立,则协方差为0,这是由于: 3d
E(X*Y) = E(X)E(Y) = mv htm
这里在深刻讲一下,什么是指望?在学习几率的时候,前面几章都是在讲述分布(正态分布,0,1分布,T分布),分布讲述的数据的规律,指望讲述的一个值,用一个数来表明你的这些数集,这个就是指望,也称之为均值,咱们看一下指望的公式: blog
你就会发现其实不管是离散的几率仍是连续的指望都是计算求全平均,这就印证上面说的:找一个数来表明你的这个分布;在numpy的array里面有一个mean函数,就是计算指望的。 get
讲到指望,就要说一下中心化(centered),所谓中心化就是列之间的指望为0。或者说PCA认为各个点都是以原点为中心来进行分散的。
SVD:奇异值分解,Singular Value Decomposition.
他的思路就是将一个矩阵(不管多复杂)用三个矩阵相乘得来:
其中M就是原始矩阵,U是M.dot(M.T)的特征向量,V是M.T.dot(M)的向量,Sigma就是一个对角矩阵。里面的元素就是奇异值。
关于矩阵乘法和特征值
矩阵的乘法(dot)本质实际上是将一个矩阵中的向量从长度(伸缩)到方向(旋转)进行转变;若是一个M.dot(N),只是有伸缩可是没有旋转,那么这个N就是M的特征向量。
那么回归本源,什么是特征值,特征向量?
对于矩阵A,若是存在数m以及向量x,知足Ax=mx,则成m为A的特征值,x是矩阵A对于m特征值的特征向量。
PCA中的核函数
不少时候,降维是为了减小数据量,提升运算速度;可是有的时候低维度的数据很差对数据进行划分,这个时候须要将数据提升维度,不少时候,高纬度数据反而更好找到super plane来对数据进行划分,那么核函数就是作这件事情的,经过提升维度来进行数据划分,将底维数据向高维数据作映射的函数,就是"核函数(kernel function)"。在sklearn里面就有KernelPCA用于为PCA指定核函数。
提到了PCA必定要提一下无偏估计。由于PCA的有一部分就是就协方差的。
方差嘛,原本应该是[X-E(X)]**2,可是主要,你如今出列都是矩阵,因此若是想要实现平方,是须要和他的转置矩阵相乘来处理的。
参考:
关于SVD很硬的一篇博客