Обобщенное собственное значение для двух матриц в OpenCV

Здравствуйте, я работаю над проектом, связанным с распознаванием лиц, для которого я использую линейный дискриминантный анализ (LDA). LDA требует найти обобщенные собственные векторы для матрицы рассеяния между классами и с матрицей рассеяния внутри класса, и именно здесь я поражен. Я использую opencv с DevC++ для кодирования. В основном проблема выглядит так

A*v=lambda*B*v

где A и B — матрицы, для которых должны быть найдены обобщенные собственные векторы, лямбда — собственные значения, а v — векторы

При поиске этой проблемы многие люди предложили вычислить обратную величину B, а затем умножить на A * v.

(inv(B)*A)*v=lambda*v 

а затем вычислить собственные векторы для inv(B)*A.

Это кажется хорошим решением, но в моем случае матрица рассеяния B почти сигулярна. Я обнаружил, что его определитель имеет порядок 10 ^ -36. Поэтому я не могу найти его инверсию и перейти к приведенному выше решению. Итак, может ли кто-нибудь предложить мне способ избавиться от этой проблемы, кроме как сказать код для обобщенной проблемы собственных значений отдельно.


person Sumanth    schedule 30.01.2012    source источник


Ответы (1)


Я предоставляю реализацию Fisherfaces в моем репозитории github по адресу https://github.com/bytefish/opencv/tree/master/lda. Это включает в себя реализацию решателя собственных значений для общих матриц, см.: https://github.com/bytefish/opencv/blob/master/lda/include/decomposition.hpp (я портировал отличный решатель JAMA), именно то, что вам нужно.

Если у вас есть проблемы с кодом, напишите мне на странице проектов по адресу http://www.bytefish.de/blog/fisherfaces_in_opencv.

person bytefish    schedule 04.03.2012