0

您好,我正在从事一个涉及人脸识别的项目,我正在使用线性判别分析(LDA)。LDA 要求找到类间散布矩阵和类内散布矩阵的广义特征向量,这就是我印象深刻的地方。我正在使用带有 DevC++ 的 opencv 进行编码。基本上问题看起来像

A*v=lambda*B*v

其中 A 和 B 是应该找到广义特征向量的矩阵 lambda 是特征值,v 是向量

在搜索这个问题后,许多人建议去计算 B 的倒数,然后乘以 A*v

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

然后计算 inv(B)*A 的特征向量。

这似乎是一个很好的解决方案,但在我的情况下,散射矩阵 B 几乎是奇异的。我发现它的行列式是 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 回答