機械学習 リファレンス マニュアル
- イントロダクション,共通のクラスと関数(Introduction. Common classes and functions)
- ナイーブベイズ(単純ベイズ)分類器(Normal Bayes Classifier)
- K近傍法(K Nearest Neighbors)
- サポートベクターマシン(SVM)
- 決定木(Decision Trees)
- ブースティング(Boosting)
- ランダムツリー(Random Trees)
- EMアルゴリズム(Expectation-Maximization)
- ニューラルネットワーク(Neural Networks)
サポートベクターマシン(SVM)
本来,サポートベクターマシン(SVM)は,(ある意味で)最適な二値(2クラス)分類器を作るためのテクニックであったが, その後,このテクニックは回帰およびクラスタリング問題に拡張されてきた. SVM はカーネルベースな手法の一つである. この手法はカーネル関数を用いて特徴ベクトルを高次元空間にマップし,この空間における最適な線形分離関数(あるいは学習データに適合する最適な超平面)を形成する. SVMの場合,高次元空間へのマッピングが陽に定義されない代わりに,超空間における二点間距離,すなわちそれを計算するカーネルの定義が必要となる.
この手法は,両クラス(2クラス分類器の場合)の分割超平面に最も近い特徴ベクトルのマージンが最大である,という意味において最適となる. 超平面に最も近い特徴ベクトルは「サポートベクター」と呼ばれ,これは,その他のベクトルの位置が超平面(決定関数)に影響を及ぼさないという事を意味している.
SVMに関する優れたリファレンスは数多く存在する.ここでは数冊を紹介するにとどめる.
[Burges98] C. Burges. "A tutorial on support vector machines for pattern recognition", Knowledge Discovery and Data Mining 2(2), 1998.(オンラインでも入手可能 http://citeseer.ist.psu.edu/burges98tutorial.html).
LIBSVM - A Library for Support Vector Machines. By Chih-Chung Chang and Chih-Jen Lin
(http://www.csie.ntu.edu.tw/~cjlin/libsvm/)
CvSVM
サポートベクターマシンクラス
class CvSVM : public CvStatModel { public: // SVM の種類 enum { C_SVC=100, NU_SVC=101, ONE_CLASS=102, EPS_SVR=103, NU_SVR=104 }; // SVM カーネルの種類 enum { LINEAR=0, POLY=1, RBF=2, SIGMOID=3 }; CvSVM(); virtual ~CvSVM(); CvSVM( const CvMat* _train_data, const CvMat* _responses, const CvMat* _var_idx=0, const CvMat* _sample_idx=0, CvSVMParams _params=CvSVMParams() ); virtual bool train( const CvMat* _train_data, const CvMat* _responses, const CvMat* _var_idx=0, const CvMat* _sample_idx=0, CvSVMParams _params=CvSVMParams() ); virtual float predict( const CvMat* _sample ) const; virtual int get_support_vector_count() const; virtual const float* get_support_vector(int i) const; virtual void clear(); virtual void save( const char* filename, const char* name=0 ); virtual void load( const char* filename, const char* name=0 ); virtual void write( CvFileStorage* storage, const char* name ); virtual void read( CvFileStorage* storage, CvFileNode* node ); int get_var_count() const { return var_idx ? var_idx->cols : var_all; } protected: ... };
CvSVMParams
SVM 学習パラメータ
struct CvSVMParams { CvSVMParams(); CvSVMParams( int _svm_type, int _kernel_type, double _degree, double _gamma, double _coef0, double _C, double _nu, double _p, CvMat* _class_weights, CvTermCriteria _term_crit ); int svm_type; int kernel_type; double degree; // poly 用 double gamma; // poly/rbf/sigmoid 用 double coef0; // poly/sigmoid 用 double C; // CV_SVM_C_SVC, CV_SVM_EPS_SVR, CV_SVM_NU_SVR 用 double nu; // CV_SVM_NU_SVC, CV_SVM_ONE_CLASS, CV_SVM_NU_SVR 用 double p; // CV_SVM_EPS_SVR 用 CvMat* class_weights; // CV_SVM_C_SVC 用 CvTermCriteria term_crit; // 終了条件 };
- svm_type
- SVM の種類.以下のうち一つ.
CvSVM::C_SVC - はずれ値に対するペナルティ乗数 C を持ち, 不完全な分離を許容する n-クラス分類(n>=2).
CvSVM::NU_SVC - 不完全な分離となる可能性がある n-クラス分類. C の代わりにパラメータ nu (0..1 の範囲,大きい値ほど滑らかな判断境界を表す)が用いられる.
CvSVM::ONE_CLASS - 1-クラス SVM.全学習データは同じクラスから得られ,SVMはそのクラスを特徴空間の他のクラスから分離する境界を求める.
CvSVM::EPS_SVR - 回帰.学習集合の特徴ベクトルと超平面との距離が p よりも短くなければならない. はずれ値に対してはペナルティ乗数 C が用いられる.
CvSVM::NU_SVR - 回帰.p の代わり にnu が用いられる. - kernel_type
- カーネルの種類.以下のうち一つ.
CvSVM::LINEAR - マッピングは行われない.もとの特徴空間内で,線形分離(あるいは回帰)が行われる.最も高速なオプション.d(x,y) = x•y == (x,y)
CvSVM::POLY - 多項式カーネル: d(x,y) = (gamma*(x•y)+coef0)degree
CvSVM::RBF - 動径基底関数カーネル.ほとんどの場合,適切に動作する: d(x,y) = exp(-gamma*|x-y|2)
CvSVM::SIGMOID - シグモイド関数がカーネルとして用いられる.d(x,y) = tanh(gamma*(x•y)+coef0)
- degree, gamma, coef0
- カーネルのパラメータ.上述の式を参照.
- C, nu, p
- 一般化 SVM の最適化問題におけるパラメータ.
- class_weights
- 特定のクラスに割り当てられる任意の重み. これに C が乗算され,それが異なるクラスに対する分類失敗ペナルティとして作用する. 重みが大きくなるほど,対応するクラスに属するデータの分類失敗に対して大きなペナルティが課せられる.
- term_crit
- SVM の反復学習手続きに対する終了条件(これは制約条件付き二次最適化問題のいくつかを解決する).
この構造体は初期化される必要があり,その後 CvSVM の学習メソッドに渡される.
CvSVM::train
SVM を学習する
bool CvSVM::train(const CvMat* _train_data, const CvMat* _responses,
const CvMat* _var_idx=0, const CvMat* _sample_idx=0,
CvSVMParams _params=CvSVMParams() );
このメソッドはSVM モデルを学習する. これは以下の制限のもと,一般的なtrain「メソッド」の仕様に従う. CV_ROW_SAMPLE データレイアウトだけがサポートされる. 入力変数は全て連続変数である. 出力変数はカテゴリ変数(_params.svm_type=CvSVM::C_SVC や _params.svm_type=CvSVM::NU_SVC)か, 連続変数(_params.svm_type=CvSVM::EPS_SVR や _params.svm_type=CvSVM::NU_SVR), あるいは全く要求されない(_params.svm_type=CvSVM::ONE_CLASS),のいずれかである. データ欠損はサポートされない.
他の全てのパラメータは構造体CvSVMParams に集められる.
CvSVM::get_support_vector*
サポートベクターの個数と,特定のサポートベクターを取得する
int CvSVM::get_support_vector_count() const; const float* CvSVM::get_support_vector(int i) const;
このメソッドは,サポートベクターの集合を取得するために使われる.