2010-12-12 4 views
2

私が作業しているアプリケーションのLDA(線形判別分析)変換を計算しています。私はこれらを追跡しています。notes(36ページから始まります。特にスライド47は緑色)。LDA変換に適した数値解答

私は(numpyのとscipyのダウンロードと)Pythonでこれをやっている、これは私が出ているものです:私は他の人にそれを比較したように、この実装が正しいことを知っている

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桁までしか一致しません。これを数値的に行うより良い方法はありますか?

+0

これは本質的には数学的な質問です。*実装*ではなく、数値*メソッド*を求めています。 http://math.stackexchange.com/で尋ねるほうが良いかもしれません。 –

+0

小数点以下6桁以上の精度が実際に必要ですか? (私は実際にはかなり良いと思うだろう)。あなたが参照する他のソリューションもPythonで実装されていますか?なぜあなたは他人の解があなたよりも数値的に優れていると思うのですか(フィッシャーの線形判別分析(http://en.wikipedia.org/wiki/Linear_discriminant_analysis)の射影ベクトルを計算する標準的な方法です)あなたはstats.stackexchange.comでも尋ねることができます。 –

+0

@Sven:私は必ずしも同意ではありません。実装の詳細は、丸め誤差*を導入するかもしれません。これは、本質的に数学的な切り捨て誤差*私は数学の人々に敬意を払っています。私はそこより良い数値学者がいると思います。 –

答えて

2

eigの代わりにeighを試してください。シグマ^ { - 1/2} B_0シグマ^ {1/2}は対称であるため、適合ルーチンを使用します。

また、B_0を計算するときに正しいアルゴリズムを使用することに注意してください。より簡単なケースについては、http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Two-pass_algorithmを参照してください(ここで変更できます)。

+0

ありがとう、これは良いヒントですが、私の結果はそれほど変わっていません...アンドレは正しいかもしれません – Anonymous

+0

LAPACK(少なくともインテルMKLバージョン)では、対称行列の固有ベクトルを高い精度で計算するオプションがあります。このメソッドはtから遠く離れています胸を張っている。 CまたはFortranでコードを書き直したい場合は、そのコードを使用することができます。 –

関連する問題