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

引言

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 Image
from numpy import *

def pca(X):
  """ 主成分分析:
    输入:矩阵X ,其中该矩阵中存储训练数据,每一行为一条训练数据
    返回:投影矩阵(按照维度的重要性排序)、方差和均值"""

  # 获取维数
  num_data,dim = X.shape

  # 数据中心化
  mean_X = X.mean(axis=0)
  X = X - mean_X

if 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] /= S
else:
  # PCA- 使用SVD 方法
  U,S,V = linalg.svd(X)
  V = V[:num_data] # 仅仅返回前nun_data 维的数据才合理

# 返回投影矩阵、方差和均值
return V,S,mean_X

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

opencv的Python接口

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

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

你可能感兴趣的:(机器学习)