我正在为我正在处理的应用程序计算 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 位。有没有更好的方法在数字上做到这一点?