2

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

4

1 に答える 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を参照してください (ここで適応できます)。

于 2010-12-12T18:27:57.897 に答える