FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SVM.NET を使ってパターン識別器をつくる

パターン認識は,画像処理や音声認識などの分野でよく取り扱われる問題の一つです.識別器にはニューラルネットワークやベイズ分類など様々な選択肢があります.サポートベクターマシン (Support Vector Machine, SVM) は識別器の一種で,認識性能に優れており,学習のパラメータ設定が比較的容易でもあります.本記事では SVM.NET を使って SVM によるパターン識別器を作成します.

Keywords: .NET Framework, SVM


SVM.NET は libsvm を .NET Framework 向けにポーティングしたライブラリで,設計が .NET らしくなるように改良されています.バイナリやソース,デモは以下のサイトからダウンロードできます.

Matthew Johnson

またオリジナルの libsvm を使われた方の記事がこちらにありますので参考にしてください.


作業環境
Visual C# 2010 Express
.NET Framework 4 Client Profile

まずコンソールアプリケーションプロジェクトを作成し,参照にダウンロードしてきた SVM.dll を追加してください.ここではプロジェクト名を SVMRecognizer とします.

次に作成された Program.cs に,以下のようにコードを追加します.
using SVM;

namespace SVMRecognizer {

class Program {

static void Main(string[] args)
{
// Creating teacher data
Node[][] nodes = new Node[4][];
nodes[0] = CreateSample(0, 0);
nodes[1] = CreateSample(0, 1);
nodes[2] = CreateSample(1, 0);
nodes[3] = CreateSample(1, 1);

double[] klass = new double[] { -1, -1, -1, 1 };

Problem train = new Problem(4, klass, nodes, 2);


// Prameter setting by grid search
Parameter param = new Parameter();
param.SvmType = SvmType.C_SVC;
param.Probability = true;

double C;
double Gamma;

ParameterSelection.Grid(train, param, "p.txt", out C, out Gamma);


// Creating recognizer
Model model = Training.Train(train, param);


// Test recognizer
PrintResult(model, CreateSample( 0.1, -0.1));
PrintResult(model, CreateSample( 2.0, 0.0));
PrintResult(model, CreateSample( 1.0, 1.2));
PrintResult(model, CreateSample(-1.0, -1.0));
}


static Node[] CreateSample(double v0, double v1)
{
Node[] nodes = new Node[2];
nodes[0] = new Node(0, v0);
nodes[1] = new Node(1, v1);
return nodes;
}


static void PrintResult(Model model, Node[] sample)
{
double[] prob = Prediction.PredictProbability(model, sample);
double cls = Prediction.Predict(model, sample);

System.Console.WriteLine(
"({0,4} {1,4}) : Class={2,2} Probability={3}",
sample[0].Value,
sample[1].Value,
(int)cls,
prob[0]
);
}

}

}
作成した識別器は,入力が正解の場合 1 を,それ以外の場合は -1 を出力します.プログラムを実行すると次のような出力が得られます.
( 0.1 -0.1) : Class=-1 Probability=0.38443096292685
( 2 0) : Class=-1 Probability=0.703893973998399
( 1 1.2) : Class= 1 Probability=0.985961794892561
( -1 -1) : Class=-1 Probability=0.704002970706598
カッコ内が入力値で Class が識別結果です.Probability は,ソースコードを読み込んでいないので言及できませんが,おそらく正解の可能性と思われます.

本記事では二次元のベクトルを識別対象としましたが,ベクトルであれば何次元であろうと識別器の作り方は一緒です.とりあえず識別器を作ってみたい人などの参考になれば幸いです.
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

Ishida Akihiko

Author:Ishida Akihiko
FC2ブログへようこそ!

免責事項
当サイトに掲載する記事内容は,必ずしも正確性,信頼性,妥当性,有用性,完成度などを保証しません.記事の利用はすべて自己責任でお願いします.当サイトに掲載された内容によって発生したいかなる損害に対しても,管理人は一切の責任を負いかねます.
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。