現在取り組んでいるアプリケーションの 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 桁までしか一致しません。これを数値的に行うより良い方法はありますか?