PCA原理以及算法实现

来源:互联网 发布:lg v20 跳过网络验证 编辑:程序博客网 时间:2024/06/10 09:05

一.算法介绍

PCA(Princiapal Component Analysis),主成分分析,是统计数据分析、特征提取和数据压缩的经典方法,起源于Pearson的早期工作。实际上,PCA主要作用就是将一个存在信息冗余的多维空间变成一个无信息冗余的较低维空间,是一种通用的降维方法。

举个例子,从一幅数字图像中取出一个8x8的像素窗口,首先通过逐行扫描,变换到向量x,其元素为64个像素的灰度值,在实时的数字视频传输中,由于数据量很大,所以在保证视频质量不至于损失太多的同时,应该尽量减少数据量。使用PCA,由x可以得到一种压缩表示y,这里y可以只有10个元素,这样就能方便的用来存储和传输了。这种压缩是可能的,因为x的相邻元素,即相邻像素的灰度值,是高度相关的。

二.算法原理

假设向量x是一个n维的随机变量,并且x的均值为0,

E(x)=0

我们想要求得这样的一个m*n的w权值矩阵,将n维度的特征空间映射成m维的特征空间,
y=wx

这里,我们需要考虑的是怎样的映射才是符合优化要求的,我们知道向量x的特征之间存在冗余信息,因而我们期望y的各个特征维度之间是正交的,且每一个维度上的分布尽可能的分散,也就是每个维度的方差尽可能的大,我们考虑到y的协方差矩阵,假设
y=(y1,y2,...ym)

那么y的协方差矩阵D为,
E(y21)E(y2y1)...E(ymy1)E(y1y2)E(y22)...E(ymy2)............E(y1ym)E(y2ym)...E(y2m)

我们可以发现,除了对角线上的元素,其余元素皆为两两维度的协方差,这里我们考虑的是,
max(E(y2i)),E(yiyj)=0,i=j

实际上就是将y的协方差矩阵进行对角化,就可以求出我们想要的w了。
D=E(yyT)=E(wx(wx)T)=E(w(xxT)wT)=wE(xxT)wT=wCwT

其中,C是X的协方差矩阵,我们将矩阵D对角化,这里使用了线性代数的特征向量的知识,我们知道满足矩阵D对角化的w需满足,

Cwi=λiwi,i=1,2,...,m

基于矩阵的基础知识,我们知道矩阵xxT是正定的,那么其对应的特征向量应该有n个,且特征值均不小于0,
λ1λ2...λn0

这里我们取前m个特征值所对应的特征向量,构成矩阵w
(w1,w2,...,wm)T

最后,我们通过y=wx将x映射到y上,实现了降维。

三、算法描述以及代码实现

算法的伪代码如下:

  1. 去除平均值
  2. 计算协方差矩阵
  3. 计算协方差矩阵的特征值和特征向量
  4. 将特征值从大到小排序
  5. 保留特征值较大的M个向量
  6. 将数据转映射到上述的M个向量构建的新空间中

这里,使用python以及numpy库来实现,

from numpy import *def PCA(data,N)    #(1)去掉平均值    meanValues=mean(data,axis=0)    removedVals=data-meanValues    #(2)计算协方差矩阵    covMat=cov(removedVals,rowvar=0)    #(3)计算协方差矩阵的特征值和特征向量    speVals,speVects=linalg.eig(mat(covMat))    #(4)将特征值从大到小排序,取前N个    speValsIndex=argsort(speVals)    speValsIndex=speVals[:N+1:-1]    #(5)保留特征值较大的N个向量    remainVects=specVects[:,speValsIndex]    #(6)将数据映射到新空间上    lowDimData=removedVals*remainVects    return lowDimData

四.感悟与不足

这里的原理介绍,数学上还很不严密,感兴趣的朋友可以自己认真推导一遍,其中主要涉及到两个问题:

  1. 怎样的基变换才能保证数据的压缩是可靠?
  2. 协方差矩阵对角化的意义是什么?
    这里仅仅是个人理解,如果有不足之处,还望指正。

五.参考资料

1.Aapo Hyvarinen等,独立成分分析》,周宗潭 翻译,电子工业出版社
2.Peter Harrington,《机器学习实战》,李锐 等翻译 ,人民邮电出版社
3.张贤达,《矩阵分析与应用》,清华大学出版社

0 0
原创粉丝点击