サポートベクタマシン ============================== .. highlight:: cpp サポートベクターマシン(SVM)は元々,(ある意味で)最適な2値(2クラス)分類器を作るための手法でした.しかしその後,この手法は,回帰やクラスタリング問題に対応するように拡張されてきました.SVM は,カーネルに基づく手法の1つです.この手法は,カーネル関数を用いて特徴ベクトルを高次元空間にマップし,この空間における最適な線形分離関数(あるいは学習データに適合する最適な超平面)を形成します.SVM の場合,高次元空間へのマッピングが陽に定義されない代わりに,超空間における任意の2点間距離の定義が必要となります. これによって得られる解は,両クラス(2クラス分類器の場合)の分割超平面に最も近い特徴ベクトルのマージンが最大である,という意味において最適といえます.超平面に最も近い特徴ベクトルは「サポートベクタ」と呼ばれ,それ以外のベクトル位置が超平面(決定関数)に影響を及ぼさないという事を表しています. SVMに関する優れたリファレンスは数多く存在しますが,ここでは入門的な数冊を紹介するにとどめます. * **[Burges98] C. Burges. "A tutorial on support vector machines for pattern recognition", Knowledge Discovery and Data Mining 2(2), 1998.** (available online at 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/ ) .. index:: CvSVM .. _CvSVM: CvSVM ----- `id=0.403503658629 Comments from the Wiki `__ .. ctype:: CvSVM サポートベクタマシン. .. code-block:: c 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 }; // SVM パラメータの種類 enum { C=0, GAMMA=1, P=2, NU=3, COEF=4, DEGREE=5 }; 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 bool train_auto( const CvMat* _train_data, const CvMat* _responses, const CvMat* _var_idx, const CvMat* _sample_idx, CvSVMParams _params, int k_fold = 10, CvParamGrid C_grid = get_default_grid(CvSVM::C), CvParamGrid gamma_grid = get_default_grid(CvSVM::GAMMA), CvParamGrid p_grid = get_default_grid(CvSVM::P), CvParamGrid nu_grid = get_default_grid(CvSVM::NU), CvParamGrid coef_grid = get_default_grid(CvSVM::COEF), CvParamGrid degree_grid = get_default_grid(CvSVM::DEGREE) ); virtual float predict( const CvMat* _sample ) const; virtual int get_support_vector_count() const; virtual const float* get_support_vector(int i) const; virtual CvSVMParams get_params() const { return params; }; virtual void clear(); static CvParamGrid get_default_grid( int param_id ); 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: ... }; .. .. index:: CvSVMParams .. _CvSVMParams: CvSVMParams ----------- `id=0.36334328081 Comments from the Wiki `__ .. ctype:: CvSVMParams SVM 学習パラメータ. .. code-block:: c 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; // 多項式カーネル用 double gamma; // 多項式 / RBF / シグモイドカーネル用 double coef0; // 多項式 / シグモイドカーネル用 double C; // CV_SVM_C_SVC, CV_SVM_EPS_SVR and 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; // 停止基準 }; .. この構造体は必ず初期化されてから, :ref:`CvSVM` の学習メソッドに渡されなければいけません. .. index:: CvSVM::train .. _CvSVM::train: CvSVM::train ------------ `id=0.351714995157 Comments from the Wiki `__ .. cfunction:: bool CvSVM::train( const CvMat* _train_data, const CvMat* _responses, const CvMat* _var_idx=0, const CvMat* _sample_idx=0, CvSVMParams _params=CvSVMParams() ) SVM の学習を行います. このメソッドは,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`` ),あるいは,1クラス分類のため指定不要,のいずれかです.データ欠損はサポートされません. その他のパラメータはすべて, :ref:`CvSVMParams` 構造体に集約されます. .. index:: CvSVM::train_auto .. _CvSVM::train_auto: CvSVM::train_auto ----------------- `id=0.617593177831 Comments from the Wiki `__ .. cfunction:: train_auto( const CvMat* _train_data, const CvMat* _responses, const CvMat* _var_idx, const CvMat* _sample_idx, CvSVMParams params, int k_fold = 10, CvParamGrid C_grid = get_default_grid(CvSVM::C), CvParamGrid gamma_grid = get_default_grid(CvSVM::GAMMA), CvParamGrid p_grid = get_default_grid(CvSVM::P), CvParamGrid nu_grid = get_default_grid(CvSVM::NU), CvParamGrid coef_grid = get_default_grid(CvSVM::COEF), CvParamGrid degree_grid = get_default_grid(CvSVM::DEGREE) ) SVM を最適なパラメータで学習します. :param k_fold: 交差検定パラメータ.学習データ集合が ``k_fold`` 個の部分集合に分割されます.ここで,ある1つの部分集合がモデルの学習に利用されて,残りがテスト集合として利用されます.したがって,SVMアルゴリズムは ``k_fold`` 回実行されることになります. このメソッドは, :ref:`CvSVMParams` から最適なパラメータ ``C`` , ``gamma`` , ``p`` , ``nu`` , ``coef0`` , ``degree`` を選択し,自動的に SVM モデルを学習します. ここでの最適とは,交差検定のテスト集合の推定誤差が最小になることを表しています.パラメータの選択は,対数グリッド単位で繰り返されます.例えば,パラメータ ``gamma`` は,( :math:`min` , :math:`min*step` , :math:`min*{step}^2` , ... :math:`min*{step}^n` )という集合から値をとります.ここで :math:`min` は ``gamma_grid.min_val`` , :math:`step` は ``gamma_grid.step`` ,そして :math:`n` は .. math:: \texttt{gamma\_grid.min\_val} * \texttt{gamma\_grid.step} ^n < \texttt{gamma\_grid.max\_val} を満たす最大のインデックス,を表します.つまり, ``step`` は常に1よりも大きくなければいけません. 最適化の必要がないパラメータであれば,それに相当するグリッドステップは1以下の任意の値にセットされるべきです.例えば, ``gamma`` を最適化しないようにするには, ``gamma_grid.step = 0`` として, ``gamma_grid.min_val`` と ``gamma_grid.max_val`` を任意の値にします.この場合, ``params.gamma`` の値が ``gamma`` として利用されます. また,最適化が必要なパラメータが存在し,そのグリッドがまったく不明な場合は,関数 ``CvSVM::get_default_grid`` を呼び出すこともできます.グリッドを生成するためには,例えば ``gamma`` の場合であれば, ``CvSVM::get_default_grid(CvSVM::GAMMA)`` を利用します. このメソッドは,回帰( ``params.svm_type=CvSVM::EPS_SVR`` または ``params.svm_type=CvSVM::NU_SVR`` )の場合と同様に,分類( ``params.svm_type=CvSVM::C_SVC`` または ``params.svm_type=CvSVM::NU_SVC`` )の場合でも利用できます. ``params.svm_type=CvSVM::ONE_CLASS`` の場合は,最適化は行われず,パラメータ ``params`` が指定された通常の SVM が実行されます. .. index:: CvSVM::get_default_grid .. _CvSVM::get_default_grid: CvSVM::get_default_grid ----------------------- `id=0.619798372135 Comments from the Wiki `__ .. cfunction:: CvParamGrid CvSVM::get_default_grid( int param_id ) SVM パラメータのためのグリッドを生成します. :param param_id: 以下のうちの1つです: * **CvSVM::C** * **CvSVM::GAMMA** * **CvSVM::P** * **CvSVM::NU** * **CvSVM::COEF** * **CvSVM::DEGREE** このIDで指定されたパラメータ用のグリッドが生成されます このメソッドは,SVM アルゴリズムの指定パラメータのためのグリッドを生成します.このグリッドは, ``CvSVM::train_auto`` に渡すことができます. .. index:: CvSVM::get_params .. _CvSVM::get_params: CvSVM::get_params ----------------- `id=0.771830124222 Comments from the Wiki `__ .. cfunction:: CvSVMParams CvSVM::get_params() const 現在の SVM パラメータを返します. このメソッドは,自動学習 ``CvSVM::train_auto`` によって得られた最適なパラメータを取得するために利用できます. .. index:: CvSVM::get_support_vector* .. _CvSVM::get_support_vector*: CvSVM::get_support_vector* -------------------------- `id=0.904151541352 Comments from the Wiki `__ .. cfunction:: int CvSVM::get_support_vector_count() const .. cfunction:: const float* CvSVM::get_support_vector(int i) const サポートベクタの個数と,特定のサポートベクタを取り出します. このメソッドは,サポートベクタの集合を取得するために利用できます.