0

こんにちは私は線形判別分析(LDA)を使用している顔認識に関連するプロジェクトに取り組んでいます。LDAは、クラス間散布行列とクラス内散布行列の一般化された固有ベクトルを見つけることを要求します。コーディングにDevC++でopencvを使用しています。基本的に問題は次のようになります

A*v=lambda*B*v

ここで、AとBは、一般化された固有ベクトルを見つける必要がある行列です。ラムダは固有値であり、vはベクトルです。

この問題について検索すると、多くの人がBの逆数を計算してから、A*vを掛けることを提案しました。

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

次に、inv(B)*Aの固有ベクトルを計算します。

これは良い解決策のようですが、私の場合、散布行列BはほぼSigularです。その行列式は10^-36のオーダーであることがわかりました。そのため、その逆行列式を見つけることができず、上記の解決策に進みます。したがって、一般化された固有値の問題を個別にコーディングすることを除いて、この問題から抜け出す方法を誰かが私に提案できますか?

4

1 に答える 1

2

https://github.com/bytefish/opencv/tree/master/ldaのgithubリポジトリでFisherfacesの実装を提供しています。これには、一般的な行列の固有値ソルバーの実装が含まれます。https ://github.com/bytefish/opencv/blob/master/lda/include/decomposition.hpp(優れたJAMAソルバーを移植しました)を参照してください。まさにあなたが探しているもの。

コードに問題がある場合は、http://www.bytefish.de/blog/fisherfaces_in_opencvのプロジェクトページにメモを送ってください

于 2012-03-04T19:05:10.693 に答える