LDA变换的有效数值解法
我正在计算一个叫做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位小数。有没有更好的数值计算方法呢?
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,里面有一个更简单的例子(你可以在这里进行调整)。