機械学習ライブラリShogun3.2をWindowsのCygwinで使う
機械学習が花盛りです。数多くの機械学習ライブラリが世に出ていますが、c++インターフェースでWindowsで動く物が、あまり多くないように見えます。更にMSVCで使えるもの、が見つかりません。MSVCで動かすことを妥協して探すと、ShogunというライブラリがCygwinで動くと書いてありました。これを試してみます。
Cygwin64ビット版にインストール
Cygwin32ビット版およびMingwでは、cmakeの段階でcmTryCompileExec~~というエラーが出て上手く動きませんでした。
Cygwin64ビット版では、上手く動きます。[7]で setup-x86_64.exeをダウンロードしてインストールします。適当に、devなどのパッケージもinstallしておきます。
Cygwin64 Terminalを開いて[2]を見ながら、順にインストール作業を進めます。
$ cd "$HOME" $ wget ftp://shogun-toolbox.org/shogun/releases/3.2/sources/shogun-3.2.0.tar.bz2 $ tar xjf shogun-3.2.0.tar.bz2 $ wget ftp://shogun-toolbox.org/shogun/data/shogun-data-0.7.tar.bz2 $ tar xjf shogun-data-0.7.tar.bz2 $ cd shogun-3.2.0 $ rm -rv data/ $ ln -s ../shogun-data-0.7 data
$ cd "$HOME/shogun-3.2.0" $ mkdir build $ cd build $ cmake -DCMAKE_INSTALL_PREFIX="$HOME/shogun-install" .. $ make -j5 all $ make install
makeの段階で、fdopenが無いなどのエラーが出てきます。これは、[6]で言及されているように、
-std=c++11 を指定すると、__STRICT_ANSI__ が定義されるため
とのことなので、
shogun-3.2.0/src/shogun/io/File.cpp
を同じように編集します。
#include <stdio.h>
#include <stdlib.h>
を、
/**** ここから ****/
#ifdef __STRICT_ANSI__
# undef __STRICT_ANSI__
# include <cstdio>
# include <string.h>
# include <stdlib.h>
# define __STRICT_ANSI__
#else
#include <stdio.h>
#include <stdlib.h>
#endif
/**** ここまで ****/
に変更します。
Exampleの実行
$LD_LIBRARY_PATHの変更が上手く反映されないので、dllを実行ファイルの場所に直接コピーします。shogun-3.2.0\build\src\shogunからcygshogun-16.dllをコピーして、shogun-install\share\shogun\examples\libshogunに貼り付けます。
$ export LD_LIBRARY_PATH="$HOME/shogun-install/lib:$LD_LIBRARY_PATH" $ cd "$HOME/shogun-install/share/shogun/examples/libshogun" $ chmod +x ./so_multiclass_BMRM && ./so_multiclass_BMRM
実行結果は、
$ chmod +x ./so_multiclass_BMRM && ./so_multiclass_BMRM
Train using lambda = 1000.000000 ICP removal = 1
result = { Fp=312.107662, Fd=309.663205, nIter=152, nCP=27, nzA=12, exitflag=1 }Error = 3.000000 %
何をしているのかよくわからないけれど、動いてはいるようです。
[1] The SHOGUN Machine Learning Toolbox
[2] SHOGUN: SHOGUN-TOOLBOX Quickstart
[3] 機械学習ライブラリ SHOGUN入門 « Rest Term
[4] SHOGUN使ってみました
[5] Robotics/Shogun - NAIST::OnlineText
[6] ブログズミ: Google Test を -std=c++11 でビルドするとエラーになっていたので修正した