LDA变换的有效数值解法

2 投票
1 回答
1641 浏览
提问于 2025-04-16 08:25

我正在计算一个叫做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,里面有一个更简单的例子(你可以在这里进行调整)。

撰写回答