2

我正在为我正在处理的应用程序计算 LDA(线性判别分析)变换,并且我一直在关注这些注释(从第 36 页开始,尤其是第 47 页的绿色幻灯片)。

我在 Python 中执行此操作(使用 numpy 和 scipy),这就是我想出的:

import numpy as np
from scipy.linalg import sqrtm
...
sw_inv_sqrt = np.linalg.inv(sqrtm(self.sigma_within))
self.d, self.v = np.linalg.eig(
    np.dot(
        np.dot(sw_inv_sqrt, self.sigma_between),
        sw_inv_sqrt
        ))
self.v = np.dot(sw_inv_sqrt, self.v)

我知道这个实现是正确的,因为我已经将它与其他实现进行了比较。我关心的是这在数字意义上是否是好的解决方案。在将我的解决方案与其他解决方案进行比较时,它们仅匹配到小数点后 6 位。有没有更好的方法在数字上做到这一点?

4

1 回答 1

2

尝试eigh代替eig. 由于 Sigma^{-1/2} B_0 Sigma^{1/2} 是对称的,因此请使用经过调整的例程。

此外,请注意在计算 B_0 时使用正确的算法。有关更简单的情况,请参见http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Two-pass_algorithm(您可以在此处调整)。

于 2010-12-12T18:27:57.897 回答