PCA for opencv

對於PCA,一直都是有個概念,沒有實際使用過,今天終於實際使用了一把,發現PCA還是挺神奇的。

在OPENCV中使用PCA非常簡單,只要幾條語句就可以了。

1、初始化數據

//每一行表示一個樣本

CvMat* pData = cvCreateMat( 總的樣本數, 每個樣本的維數, CV_32FC1 );

CvMat* pMean = cvCreateMat(1, 樣本的維數, CV_32FC1);

//pEigVals中的每個數表示一個特徵值

CvMat* pEigVals = cvCreateMat(1, min(總的樣本數,樣本的維數), CV_32FC1);

//每一行表示一個特徵向量

CvMat* pEigVecs = cvCreateMat( min(總的樣本數,樣本的維數), 樣本的維數, CV_32FC1);

2、PCA處理,計算出平均向量pMean,特徵值pEigVals和特徵向量pEigVecs

cvCalcPCA( pData, pMean, pEigVals, pEigVecs, CV_PCA_DATA_AS_ROW );

3、選出前P個特徵向量(主成份),然後投影,結果保存在pResult中,pResult中包含了P個係數

CvMat* pResult = cvCreateMat( 總的樣本數, PCA變換後的樣本維數(即主成份的數目), CV_32FC1 );

cvProjectPCA( pData, pMean, pEigVecs, pResult );

4、 重構,結果保存在pRecon中

CvMat* pRecon = cvCreateMat( 總的樣本數, 每個樣本的維數, CV_32FC1 );

cvBackProjectPCA( pResult, pMean, pEigVecs, pRecon );

5、重構誤差的計算

計算pRecon和pData的"差"就可以了.

使用時如果是想用PCA判斷“是非”問題,則可以先用正樣本計算主成分,判斷時,對需要判斷得數據進行投影,然後重構,計算重構出的數據與原數據的差異,如果差異在給定範圍內,可以認爲“是”。

如果相用PCA進行分類,例如對數字進行分類,則先用所有數據(0-9的所有樣本)計算主成分,然後對每一類數據進行投影,計算投影的係數,可簡單得求平 均。即對每一類求出平均係數。分類時,將需要分類得數據進行投影,得到係數,與先前計算出得每一類得平均係數進行比較,可判爲最接近得一類。當然這只是最 簡單得使用方法

發佈了5 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章