我正在计算一个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位小数有没有更好的方法以数字方式做到这一点?
答案 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。