2016年4月7日木曜日

C言語でレーベンバーグ・マーカート法(Levenberg-Marquardt)をやってみた

最小二乗法を実験するブログ、最終回の本日は、レーベンバーグ・マーカート法です。
最小二乗法は線形関数を推定する場合は簡単なのですが、非線形の場合とっても難しくなるようです。

ソースコードでいうと、線形の場合、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 件のコメント:

コメントを投稿