opencv笔记(9):特征降维-PCA

来源:互联网 发布:划船机品牌 知乎 编辑:程序博客网 时间:2024/06/05 09:07

特征降维-PCA

在进行图像的特征提取过程中,提取的特征维数太多经常会导致特征匹配时过于复杂,大量消耗系统资源,所以需要采用特征降维的方法。所谓的特征降维就是采用一个低纬度的特征来表示高纬度。一般的,特征降维有两种方式:特征选择和特征抽取。特征选择是从高纬度的特征中选取其中的一个子集作为新的特征;而特征抽取指的是将高纬度的特征经过某个函数映射至低纬度作为新的特征。常用的特征抽取方法就是主成分分析(Principal Component Analysis,PCA)。

1.PCA算法流程

假设有m个samples,每个数据有n维。

----------------------------------------数据预处理----------------------------------------

1. 计算各个feature的平均值,计μj ;(Xj(i)表示第i个样本的第j维特征的value)

μj = Σm Xj(i)/m


2. 将每一个feature scaling:将在不同scale上的feature进行归一化;

3. 将特征进行mean normalization
令Xj(i)= (Xj(i)j)/sj

这样呢,我们需要做的就是两件事:
第一,如何寻找这个surface?
第二,给定surface,怎样求点到surface投影的value?



--------------------------------------- PCA算法选取k个主分量----------------------------------------


4. 求n×n的协方差矩阵Σ:



5. 根据SVD求取特征值和特征向量:
[U,S,V] = SVD(Σ)
其中,SVD为奇异值分解(singular value decomposition),在matlab中有函数[U,S,V] = svd(A) 返回一个与A同大小的对角矩阵S(由Σ的特征值组成),两个酉矩阵U和V,且满足= U*S*V'。若A为m×n阵,则U为m×m阵,V为n×n阵。奇异值在S的对角线上,非负且按降序排列。
那么对于方阵Σ呢,就有
Σ = USV'
ΣΣ' = USV'*VS'U' = U(ΣΣ')U'
Σ'Σ = VS'U'*USV' = V(Σ'Σ)V'
i.e. U是ΣΣ'的特征向量矩阵;V是Σ'Σ的特征向量矩阵,都是n*n的矩阵
由于方阵的SVD相当于特征值分解,所以事实上U = V, 即Σ = USU', U是特征向量组成的正交矩阵

我们的目的是,从n维降维到k维,也就是选出这n个特征中最重要的k个,也就是选出特征值最大的k个~so...goto next step


6. 按特征值从大到小排列,重新组织U
如果使用matlab的svd求得特征值,就可以直接跳过这步了,因为该函数返回值中,奇异值在S的对角线上按照降序排列。否则的话应进行排序,并按照该次序找到对应的特征向量重新排列。


7. 选择k个分量
按照第五、六步中讲的svd过后,我们得到了一个n×n的矩阵Σ和U,这时,我们就需要从U中选出k个最重要的分量;即选择前k个特征向量,即为Ureduce, 该矩阵大小为n×k

这样对于一个n维向量x,就可以降维到k维向量z了:

2.pca()函数

(1)PCA构造函数
PCA类是opencv实现主要成分分析的类,使用前需要先实例化对象。
PCA(InputArray data,InputArray mean,int flags,int maxComponents = 0);

PCA(InputArray data, InputArray mean, int flags, double retainedVariance);

参数1:需要PCA的数据,每一行(列)表示一个样本;
参数2:平均值;如果矩阵是空的(noArray()),则从数据计算;
参数3:操作标志,具体参数如下:
DATA_AS_ROW :每一行表示一个样本;
DATA_AS_COL :每一列表示一个样本;
参数4(maxComponents) :PCA应保留的最大组件数;默认情况下,所有组件都保留;
参数4(retainedVariance):PCA应保留的方差百分比。使用这个参数将让PCA决定保留多少组件,但它将始终保持至少2。

(2)PCA::project函数
该函数的作用是将输入数据vec(该数据是用来提取PCA特征的原始数据)投影到PCA主成分空间中去,返回每一个样本主成分特征组成的矩阵。因为经过PCA处理后,原始数据的维数降低了,因此原始数据集中的每一个样本的维数都变了,由改变后的样本集就组成了本函数的返回值。
Mat project(InputArray vec) const;

(3)PCA::reshape函数
该函数会为当前矩阵创建一个新的矩阵头(指针),新的矩阵拥有不同的尺寸或者不同的通道数,其优点在于运算复杂度为O(1),不用复制矩阵数据.正是因为不用复制数据,所以在转变过程中要保证原数据矩阵在数据上的连续性(这里的连续性是相对于原矩阵来说)
Mat reshape(int cn, int rows=0) const;
参数1:新的通道数,若cn为0表示变换前后的通道数不变。
参数2:新的行数,若为0,表示不变。

(4)Mat::convertTo函数
这个函数提供点算子(像素变换)能力,通过增益(alpha)和偏置(beta)参数对图像进行调整,我们也可以使用它完成亮度(beta)和对比度(alpha)的调整,其公式如下
void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;
参数1:输出矩阵,若使用前没有声明或者需要修改,会自行分配。
参数2:新的矩阵类型。
参数3:对比度。
参数4:亮度。
0 0
原创粉丝点击