最小二乗法を実験するブログ、最終回の本日は、レーベンバーグ・マーカート法です。
最小二乗法は線形関数を推定する場合は簡単なのですが、非線形の場合とっても難しくなるようです。
ソースコードでいうと、線形の場合、C言語のファイルが一つなのですが、非線形の場合、ファイルが2000個近くになります。
ビッグマックセットに例えると、普通のビッグマックセット650円なのにグランドビックマックセット130万円って感じでしょうか。
とりあえず、C言語でレーベンバーグ・マーカート法をやるには以下の二つのライブラリがいります。
levmar
http://users.ics.forth.gr/~lourakis/levmar/
LAPACK
http://www.netlib.org/lapack/
levmarは名前からもわかるようにレーベンバーグ・マーカート法のライブラリです。
しかもこのライブラリはLAPACKというフォートラン言語で書かれたベクトル演算ライブラリを使っています。さらにLAPACKはBLASというライブラリを使っています。
フォートラン?
フォートランっていう言葉20年ぶりくらいに久しぶりに聞いた。
このLAPACKというライブラリをC言語からどうやって使うかというと
1.コンパイルしてあるライブラリをどっかから持ってきて使う
2.フォートランコンパイラでコンパイルして、ラッパーをCコンパイラでコンパイルして使う
3.f2cでフォートラン部分のソースコードをC言語に変換して、BLASとlibf2cとも一緒にコンパイルして使う。
このどれかの方法でやらないといけません。
一番簡単な1の方法を使おうと思ったのですが、VisualStudio2008用のライブラリしかない・・・・。
仕方がないので3の方法でコンパイルをすることにします。
f2cをかけたC言語のソースコードはCLAPACKというようで、以下のところにあります。
http://www.netlib.org/clapack/
CLAPACKのソースコードを取ってきて、Visual-C2015で頑張ってコンパイルします。
ひたすら2000ファイル近いソースコードをコンパイルし、エラー部分を修正していきます。
なんというめんどくさい作業。
さらに、levmarをCLAPACKに対応するように修正。
それでも半日くらいかければコンパイルすることができます。
http://kivantium.hateblo.jp/entry/20140408/p1
これでやっと上記のソースコードをVisualStudioで動かすことができました。
VisualStudioでも動くようにした、フルC言語のLAPACKとlevmarはこちら。
https://drive.google.com/open?id=0B5M9qMMg3tfQRDVRaWpuVVh1OWc
コンパイルが面倒ですが、一度作ってしまえばWindows版のBLASとLAPACKだけでもしばらくいろいろ遊んで楽しめそう。
0 件のコメント:
コメントを投稿