LDA转换的良好数值解

时间:2010-12-12 17:59:43

标签: python math numpy scipy numerical-methods

我正在计算一个LDA(线性判别分析)变换,对于我正在研究的应用程序,我一直在关注这些notes(从第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位小数有没有更好的方法以数字方式做到这一点?

1 个答案:

答案 0 :(得分: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

相关问题