サポートベクタマシン

サポートベクターマシン(SVM)は元々,(ある意味で)最適な2値(2クラス)分類器を作るための手法でした.しかしその後,この手法は,回帰やクラスタリング問題に対応するように拡張されてきました.SVM は,カーネルに基づく手法の1つです.この手法は,カーネル関数を用いて特徴ベクトルを高次元空間にマップし,この空間における最適な線形分離関数(あるいは学習データに適合する最適な超平面)を形成します.SVM の場合,高次元空間へのマッピングが陽に定義されない代わりに,超空間における任意の2点間距離の定義が必要となります.

これによって得られる解は,両クラス(2クラス分類器の場合)の分割超平面に最も近い特徴ベクトルのマージンが最大である,という意味において最適といえます.超平面に最も近い特徴ベクトルは「サポートベクタ」と呼ばれ,それ以外のベクトル位置が超平面(決定関数)に影響を及ぼさないという事を表しています.

SVMに関する優れたリファレンスは数多く存在しますが,ここでは入門的な数冊を紹介するにとどめます.

CvSVM

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 };

    // 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:
    ...
};

CvSVMParams

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; // 多項式カーネル用
    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; // 停止基準
};

この構造体は必ず初期化されてから, CvSVM の学習メソッドに渡されなければいけません.

cv::CvSVM::train

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クラス分類のため指定不要,のいずれかです.データ欠損はサポートされません.

その他のパラメータはすべて, CvSVMParams 構造体に集約されます.

cv::CvSVM::train_auto

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 を最適なパラメータで学習します.

Parameter:k_fold – 交差検定パラメータ.学習データ集合が k_fold の部分集合に分割され,ある1つの部分集合がモデルの学習に利用されて,残りがテスト集合として利用されます.したがって,SVMアルゴリズムは k_fold 回実行されることになります

このメソッドは, CvSVMParams から最適なパラメータ C , gamma , p , nu , coef0 , degree を選択し,自動的に SVM モデルを学習します. ここでの最適とは,交差検定のテスト集合の推定誤差が最小になることを表しています.パラメータの選択は,対数グリッド単位で繰り返されます.例えば,パラメータ gamma は,( min , min*step , min*{step}^2 , ... min*{step}^n )という集合から値をとります.ここで mingamma_grid.min_valstepgamma_grid.step ,そして n

\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_valgamma_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 が実行されます.

cv::CvSVM::get_default_grid

CvParamGrid CvSVM::get_default_grid(int param_id)

SVM パラメータのためのグリッドを生成します.

Parameter:param_id

以下のうちの1つ:

  • CvSVM::C
  • CvSVM::GAMMA
  • CvSVM::P
  • CvSVM::NU
  • CvSVM::COEF
  • CvSVM::DEGREE

このIDで指定されたパラメータ用のグリッドが生成されます

このメソッドは,SVM アルゴリズムの指定パラメータのためのグリッドを生成します.このグリッドは, CvSVM::train_auto に渡すことができます.

cv::CvSVM::get_params

CvSVMParams CvSVM::get_params() const
現在の SVM パラメータを返します.

このメソッドは,自動学習 CvSVM::train_auto によって得られた最適なパラメータを取得するために利用できます.

cv::CvSVM::get_support_vector*

int CvSVM::get_support_vector_count() const
const float* CvSVM::get_support_vector(int i) const
サポートベクタの個数と,特定のサポートベクタを取り出します.

このメソッドは,サポートベクタの集合を取得するために利用できます.

目次

前のトピックへ

K-近傍法

次のトピックへ

決定木

このページ