opencv筆記(9):特征降維-PCA


特征降維-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:亮度。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com