Introduction
直前の記事であろうことか説明とサンプルで使っているライブラリを間違えるというドジを踏みました。
謹んでお詫びします。
で、**Support Vector Machine (SVM)**のライブラリをたくさん調べたのですが、以前話したようにそこまで多くありません。
なので、自分で作ってみました。
本当は、LibSvm.Net て名前で登録したかったんですが、既に存在するために泣く泣くこうなりました。
まぁ、githubのリポジトリのurlもこうだから、悪くないと言えば悪くないのですが…
ところで、世の中に存在する.NETのSVMライブラリのほとんどが LIBSVM のラッパーであるのと同じく、自分で作ったのもラッパーです。
もう少し違いを説明します。
- Accord.NET
- 有名どころです。SVM以外の機械学習も可能です。SVMは独自の実装の模様。ただ、LIBSVMのモデルファイルを読めたりします。
- KMLib
- GPUを使える模様。が、最終更新が5年前。CUDA 3.0…
- LibSVMsharp
- 最新のLIBSVMに対応。libsvm.dllを直接読み込みます。
- libsvm.net
- 最終更新が3年前。また、Javaのラッパー IKVM を経由しているため速度面で不利。
- libsvm.clr
- C++/CLIでLIBSVMを再ビルドして.NETから呼べるようにしています。
この中で立ち位置が近いのは、
- LibSVMsharp
- libsvm.net
- libsvm.clr
です。
LibSvm.Netとの違いを説明すると、
- LibSVMsharp
- LibSVMsharpは、Predict関数を呼ぶ度にモデルファイルをアンマネージド領域にコピーしています。なので、何度も予測処理をかけたりする場合は、LibSvm.Netは効率よく動作します。
- 一応、何度も呼び出さないようにする方法もありますが、ポインタを受け渡しするという開発者泣かせの方式。
- libsvm.net
- Javaなんか経由しません。LibSvm.Netは100%C#でP/Invokeで直接LIBSVMを呼び出します。
- libsvm.clr
- C++/CLIなので、LinuxやMacで使えません。LibSvm.Netは100%C#の.NETStandard準拠です。他の依存ライブラリもありません。Linuxで動くことも確認しています。
何より、XMLコメントほぼ全て英語と日本語で実装していますので、IntelliSenseがバリバリ効きます!!
使い勝手は他とどっこいどっこいですが、前回と同じサンプルをLibSvm.Netで実装したものを持ってきました。
Get Started
LibSvm.Netを使うには下記の作業が必要です。
1.NugetからLibSvm.Netのインストール
2.LIBSVMのソースをダウンロード
3.LIBSVMのソースをビルド
ちょっと面倒ですが、どれも手順はしっかりしています。
LIBSVMのビルド手順はLibSvm.NetのWikiでも説明していますので参考にしてください。
Sample
前回と同じですが、LibSvm.Netで再実装したソースです。
というか、LibSvm.Netのリポジトリにあるサンプルです。
1 | using System; |
前回と違い、ModelとProblemがIDisposableな事くらいですかね、違いは。
ちなみに、libsvm.net、libsvm.clrはProblem、Model、Parameter、Nodeの全てが構造体です。
対して、LibSvm.NetはNodeだけが構造体です。古い記事ですが、.NETにおける構造体とクラスの使い分けの基準となるサイズの分水嶺は16バイトです。
Nodeは16バイトで境界値の真上ですが、Modelは184バイト、Paramterは104バイトです。
Modelファイルは予測処理を行う場合、頻繁に受け渡しする値です。libsvm.clrとか大丈夫?
実行すると下記のような出力を行います。ここも同じですね。
強いて言うなら、.NET Coreのコンソールになっているくらいです。
1 | D:\Works\OpenSource\LibSvmDotNet\example\Classification10> dotnet run -c Release |
Conclusion
正直車輪の再発明な気がしないでもないですが、コメントを書くに当たりSVMの資料を漁るに漁ったので単語の意味とか朧気だったのが、ある程度わかるようになっています。
日本語に直すの大変ですよ、本当に。
Source Code
https://github.com/takuya-takeuchi/LibSvmDotNet/tree/master/example/Classification10