在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的所有樣本)計算主成分,然後對每一類數據進行投影,計算投影的係數,可簡單得求平 均。即對每一類求出平均係數。分類時,將需要分類得數據進行投影,得到係數,與先前計算出得每一類得平均係數進行比較,可判爲最接近得一類。當然這只是最 簡單得使用方法