はじめての曲線フィッティング(はじきょく)

タイトルに同じネタを使いまわしてる気がするな...
結局,安定化双共役勾配法 BiConjugate Gradient Stabilized (Bi-CGSTAB) methodをJavaで実装してAx = bを解いて,それに基づいてJavaで曲線フィッティング・アルゴリズムであるLevenberg-Marquardtアルゴリズムを実装した.

Bi-CGSTABはKrylov部分空間に基づいて効率よく反復を行う共役勾配 (CG: Conjugate Gradient) 法を一般の(対称でも正定値でもない)行列に拡張したものらしい.Levenberg-MarquardtはIgorのマニュアルに「Igorの曲線フィッティングはこれに基づいてる」と書いてあったので知ったのだが,どうも極めてスタンダードな手法らしい.Wikipediaの記述ではダンピング係数を決めるヒューリスティクスの細部がよく分からなかったが,ヒューリスティクスというものは細部が多少異なっていても大きな問題は出ないということにしてスルー.
Javaは遅いと言われているが,少なくともパラメタ数7(Aが7次正方行列)のときはLevenberg-MarquardtCore 2 Duo T2300のマシンで瞬時に終わった.これはいいね.
もう少しインタフェイスを整えたらソースをうpしてみよう.(まぁApache Commonsとかに入ってる*1みたいだけど)
追記:J^T Jはどう見ても正定値対称です*2本当に(ry
やっぱ眠いと駄目だな...
追記: 結局,AをCholesky分解してAx = bを解いた.一部のデータで収束に時間がかかっていた問題が解決された.そりゃ小さな密行列を反復法で扱うってのが間違ってますよね,ハイ.