PCA算法原理

来源:互联网 发布:电脑随机抽奖软件 编辑:程序博客网 时间:2024/05/21 00:16

图像特征提取之--PCA方法

原创 2015年11月24日 15:53:01

引言

PCA是Principal Component Analysis的缩写,也就是主成分分析。也是用于降维常用的一中方法。PCA 主要用于数据降维,对于高维的向量,PCA 方法求得一个 k 维特征的投影矩阵,这个投影矩阵可以将特征从高维降到低维。投影矩阵也可以叫做变换矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。通过求样本矩阵的协方差矩阵,然后求出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值的大小。

数据降维的目的:

  • 减少预测变量的个数,
  • 确保这些变量是相互独立的,
  • 提供一个框架来解释结果。

降维后的特征向量减少冗余,具有低相关性等性质,在某些程度上反应了特征的本质,且在以后做分类预测等时,不容易陷入过拟合(overfitting)。

数学理论

输入一组大小为 w×h 的图像,将其按列相连构成一个 M=w×h 维的列向量。设一共有 N 张图像, Xj维第 j 副图像的列向量,X 为 N 副图像组合起来的图像矩阵。则总体的协方差矩阵: 

=1Ni=1N(Xiμ)(Xiμ)T,

其中,μ 为样本集图像的平均图像向量,i.e.,μ=1NNi=1Xi.

然后求解矩阵  的特征值与对应的特征向量,可以用 QR 算法,也可以用 SVD 分解算法等。设它的特征值 λi,(i=1,2,,wh) 按大小降序排列,对应的特征向量(正交归一化后)ui。取前 L 个特征向量构成投影矩阵 Eig=(u1,u2,,uL)L 的取值可以根据特征值的累计贡献率来确定: 

αLi=1λiwhi=1λi,

一般 α=90%99%.

Eig 即为投影矩阵,原来高维 (wh×1) 的图像列 Xi 经过投影矩阵降维后的结果为: 

Featurei=EigTXi,

Featurei 为 L×1 位的列向量。这样就达到了降维的效果,也就是提取了有用的特征,且尽量地保留原来向量的内部信息。

Python 代码实现参考这里

from PIL import Imagefrom numpy import *def pca(X):  """ 主成分分析:    输入:矩阵X ,其中该矩阵中存储训练数据,每一行为一条训练数据    返回:投影矩阵(按照维度的重要性排序)、方差和均值"""  # 获取维数  num_data,dim = X.shape  # 数据中心化  mean_X = X.mean(axis=0)  X = X - mean_Xif dim>num_data:  # PCA- 使用紧致技巧  M = dot(X,X.T) # 协方差矩阵  e,EV = linalg.eigh(M) # 特征值和特征向量  tmp = dot(X.T,EV).T # 这就是紧致技巧  V = tmp[::-1] # 由于最后的特征向量是我们所需要的,所以需要将其逆转  S = sqrt(e)[::-1] # 由于特征值是按照递增顺序排列的,所以需要将其逆转  for i in range(V.shape[1]):    V[:,i] /= Selse:  # PCA- 使用SVD 方法  U,S,V = linalg.svd(X)  V = V[:num_data] # 仅仅返回前nun_data 维的数据才合理# 返回投影矩阵、方差和均值return V,S,mean_X
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

对于输出的 V 取前 L 列即可。

opencv的Python接口

cv2.PCAComputeVar(data, retainedVariance[, mean[,eigenvectors]]) → mean, eigenvectors 
具体代码见我的另外一篇博客。

进一步,还有 Kernel PCA,将在以后记录。

PCA其它的博客地址

http://blog.csdn.net/ybdesire/article/details/6270328/

原创粉丝点击