2013-03-07 5 views
0

Я пытаюсь использовать класс PCA в OpenCv для выполнения операции анализа основных компонентов в моем приложении на C++. Я новичок в OpenCV, и у меня проблема. Поэтому я хочу, чтобы кто-то мог помочь.OpenCV 2.4.3 Класс PCA - когда количество выборок меньше числа измерений

Я пытаюсь демонстрацию Пример как для Matlab, так и для класса PCA для проверки ответов , когда я использую массив данных 2 * 10, и параметр (CV_PCA_DATA_AS_COL), здесь у меня два измерения, поэтому я ожидая иметь 2 собственных вектора, каждый из которых имеет 2 элемента, и это работало нормально, как ожидалось, с теми же результатами, что и Matlab.

Но при использовании массива данных 10 * 2 (как правило, когда количество выборок меньше числа измерений), я получаю (2 * 10) массив eiegnvectors. I.e: 10 собственных векторов с 2 элементами каждый. Этого не ожидается, и это не результат, данный 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

+0

Возможно, это вопрос о CV_PCA_DATA_AS_COL и CV_PCA_DATA_AS_ROW здесь? например. я успешно использовал penc для opencv для обнаружения лиц с строками в виде числа изображений, а cols - как общее число элементов изображения, сглаженное в 1d-массив. – berak

+0

Код: Mat Mean; \t Mat H (2, 10, CV_32F); // затем матрица заполняется данными PCA pca (H, среднее значение, CV_PCA_DATA_AS_COL, 0); \t pca.operator() (H, среднее значение, CV_PCA_DATA_AS_COL, 0); соиЬ << pca.eigenvectors.rows // дает 2 COUT << pca.eigenvectors.cols // дает 2, и это хорошо другой случай: Mat Mean; \t Mat H (10, 2, CV_32F); // затем матрица заполняется данными PCA pca (H, среднее значение, CV_PCA_DATA_AS_COL, 0); \t pca.operator() (H, среднее значение, CV_PCA_DATA_AS_COL, 0); cout << pca.eigenvectors.rows // дает 2 вместо 10 cout << pca.eigenvectors.cols // дает 10 Спасибо – user2146301

ответ

0

Я бы утверждать это следующим образом:

Если число выборок меньше, чем размер данных, то число сохраненных компонентов будет зажатой в количестве образцов.

Мы сделали 3x3 PCA для темы механики в uni, а также некоторые нелинейные алгоритмы управления использовали аналогичные подходы - моя память туманна, но она может иметь какое-то отношение к предположениям относительно psuedo-inverses и неквадратных матриц. ..

Как только вы углубитесь в теорию - websearch 'pca с меньшим количеством образцов, чем размеры' - она ​​становится беспорядочной!

Смежные вопросы