2013-03-07 55 views
0

我想在OpenCv中使用PCA類來執行我的C++應用程序中的主要組件分析操作。我是OpenCV的新手,我遇到了問題所以我希望有人能幫忙。OpenCV 2.4.3 PCA類 - 當樣本數小於維數

我正在試用Matlab和PCA類的示例來檢查答案 當我使用2 * 10數據數組和參數(CV_PCA_DATA_AS_COL),在這裏我有兩個維度,所以我是期望有2個特徵向量每個都有2個元素,並且如預期的那樣工作良好,其結果與Matlab相同。

但是當使用10 * 2數據數組(通常當樣本數小於維數)時,我得到(2 * 10)個數字的向量。即:每個具有2個元素的10個特徵向量。這不是預期的,也不是Matlab給出的結果(Matlab給出10×10矩陣的特徵向量)。

我不知道爲什麼我有這些結果,因此我無法在我的應用程序中的主要組件上投影數據,有什麼幫助?

PS:我使用的代碼:

Mat Mean ; 
Mat H(10, 2, CV_32F); // then the matrix is filled by data 
    PCA pca(H,Mean,CV_PCA_DATA_AS_COL,0) ; 
pca.operator()(H,Mean,CV_PCA_DATA_AS_COL,0) ; 
    cout<<pca.eigenvectors.rows // gives 2 instead of 10 
    cout<<pca.eigenvectors.cols // gives 10 
+0

你可以發佈你正在使用的C++代碼嗎? – crazylpfan 2013-03-07 23:19:14

+0

也許這是關於CV_PCA_DATA_AS_COL vs CV_PCA_DATA_AS_ROW的問題嗎?例如。我已經成功地使用opencv的pca進行人臉檢測,將行作爲圖像的數量,並將cols作爲每個圖像的總計數,並將其平鋪爲1d數組。 – berak 2013-03-07 23:40:57

+0

該代碼: 平均數; \t Mat H(2,10,CV_32F); //然後矩陣由數據填充 PCA pca(H,Mean,CV_PCA_DATA_AS_COL,0); \t pca.operator()(H,Mean,CV_PCA_DATA_AS_COL,0); COUT << pca.eigenvectors.rows //給出2 COUT << pca.eigenvectors.cols //給出2,這是細 另一種情況下: 墊平均數; \t Mat H(10,2,CV_32F); //然後矩陣由數據填充 PCA pca(H,Mean,CV_PCA_DATA_AS_COL,0); \t pca.operator()(H,Mean,CV_PCA_DATA_AS_COL,0); cout << pca.eigenvectors.rows //給出2而不是10 cout << pca.eigenvectors.cols //給出10 謝謝 – user2146301 2013-03-08 13:06:35

回答

0

我聲明,如下所示:

如果採樣的數量小於數據尺寸則保持部件的數量將是限制在樣本數量上。

我們在uni上爲機械學科做了3x3的主成分分析,也有一些非線性控制算法使用了類似的方法 - 我的記憶是模糊的,但它可能與假設有關僞逆矩陣和非矩陣矩陣有關。 ..

一旦你深入理論 - websearch'具有比維度更少的樣本的pca' - 它會變得非常雜亂!