統計モデル

CvStatModel

CvStatModel

MLの統計モデルのための基底クラス.

class CvStatModel
{
public:
    /* CvStatModel(); */
    /* CvStatModel( const CvMat* train_data ... ); */

    virtual ~CvStatModel();

    virtual void clear()=0;

    /* virtual bool train( const CvMat* train_data, [int tflag,] ..., const
        CvMat* responses, ...,
     [const CvMat* var_idx,] ..., [const CvMat* sample_idx,] ...
     [const CvMat* var_type,] ..., [const CvMat* missing_mask,]
        <misc_training_alg_params> ... )=0;
    */

    /* virtual float predict( const CvMat* sample ... ) const=0; */

    virtual void save( const char* filename, const char* name=0 )=0;
    virtual void load( const char* filename, const char* name=0 )=0;

    virtual void write( CvFileStorage* storage, const char* name )=0;
    virtual void read( CvFileStorage* storage, CvFileNode* node )=0;
};

上記の宣言では,いくつかのメソッドがコメントアウトされています.実際,(デフォルトコンストラクタを除いて)これらのメソッドのための統一的なAPIは存在しません.しかし後で述べるように,それらが基底クラスの一部であるかのような,構文的・意味的な類似性が多く存在します.

cv::CvStatModel::CvStatModel

CvStatModel::CvStatModel()
デフォルトコンストラクタ.

MLのそれぞれの統計モデルクラスは,引数をとらないデフォルトコンストラクタを持ちます.このコンストラクタは,デフォルトコンストラクタに続いて train()load() が呼ばれるような,2段階のモデルコンストラクションを行う際に役立ちます.

cv::CvStatModel::CvStatModel(...)

CvStatModel::CvStatModel(const CvMat* train_data ...)
学習コンストラクタ.

MLのクラスの多くは1段階のコンストラクタと学習用コンストラクタを提供します.このコンストラクタは,デフォルトコンストラクタの後に,このコンストラクタに渡されたパラメータを引数とする train() メソッドが呼ばれる状態と等価です.

cv::CvStatModel::~CvStatModel

CvStatModel::~CvStatModel()
仮想デストラクタ.

基底クラスのデストラクタは仮想関数と宣言されるので,以下のようなコードを書いても安全です:

CvStatModel* model;
if( use_svm )
    model = new CvSVM(... /* SVM パラメータ */);
else
    model = new CvDTree(... /* 決定木パラメータ */);
...
delete model;

通常,派生クラスのデストラクタは何もしませんが,そのインスタンス内で,すべてのメモリを解放するオーバーライドされたメソッド clear() が呼び出されます.

cv::CvStatModel::clear

void CvStatModel::clear()
メモリを解放し,モデルの状態をリセットします.

clear メソッドは,デストラクタと同等の働きをします.つまり,クラスメンバによって占有されるすべてのメモリを解放します.しかし,オブジェクト自身は解放されないので,後で再利用することもできます.このメソッドは,デストラクタや派生クラスの train メソッド, load() メソッド, read() メソッドなどから呼ばれますが,ユーザが明示的に呼ぶこともできます.

cv::CvStatModel::save

void CvStatModel::save(const char* filename, const char* name=0)
モデルをファイルに保存します.

save メソッドは,指定した名前,もしくは(それぞれのクラスに依存する)デフォルトの名前の XMLファイル か YAMLファイルに,モデルの全状態を保存します.ここでは CxCore の データ永続化 機能が利用されています.

cv::CvStatModel::load

void CvStatModel::load(const char* filename, const char* name=0)
モデルをファイルから読み込みます.

load メソッドは,指定した XMLファイルか YAMLファイルから指定した名前(もしくは,モデルに依存するデフォルト名)を持つモデルの,全ての状態を読み込みます.以前のモデル状態は clear() によってクリアされます.

このメソッドは仮想関数なので,このメソッドを使ってあらゆるモデルを読み込めることに注意してください.しかし一般的な cvLoad を使って読み込まれる OpenCVの C言語の型とは異なり,空のモデルをあらかじめ作成しておかなければいけないので,モデル型は既知である必要があります.この制限は,今後の ML のバージョンでは取り除かれる予定です.

cv::CvStatModel::write

void CvStatModel::write(CvFileStorage* storage, const char* name)
モデルをファイルストレージに書き込みます.

write メソッドは,指定された名前,または(それぞれのクラスに依存する)デフォルト名で,全モデル状態をファイルストレージに書き込みます.このメソッドは, save() から呼び出されます.

cv::CvStatModel::read

void CvStatMode::read(CvFileStorage* storage, CvFileNode* node)
モデルをファイルストレージから読み込みます.

read メソッドは,ファイルストレージの指定されたノードから全モデル状態を復元します.ユーザは,関数 GetFileNodeByName を用いて,そのノードはを指定しなければいけません.

以前のモデル状態は clear() によってクリアされます.

cv::CvStatModel::train

bool CvStatMode::train(const CvMat* train_data, [int tflag, ] ..., const CvMat* responses, ..., [const CvMat* var_idx, ] ..., [const CvMat* sample_idx, ] ... [const CvMat* var_type, ] ..., [const CvMat* missing_mask, ] <misc_training_alg_params> ...)
モデルを学習します.

このメソッドは,入力した特徴ベクトルとそれに対応する出力値(応答)を使って統計モデルを学習させます.入力と出力のベクトル/値はどちらも行列として渡されます.デフォルトでは,入力特徴ベクトルは train_data の行に格納されています.つまり,学習ベクトルの全成分(特徴)は連続的に保存されています.しかし,入力集合全体について,各特徴(成分/入力変数)のすべての値が連続して格納されている場合には,その転置表現を扱うことができるアルゴリズムも存在します.もし両方の表現がサポートされている場合は,それを指定する tflag パラメータが存在します.

  • tflag=CV_ROW_SAMPLE は,特徴ベクトルが行ごとに保存されていることを意味します.
  • tflag=CV_COL_SAMPLE は,特徴ベクトルが列ごとに保存されていることを意味します.

train_data は, CV_32FC1 (32ビット,浮動小数点数,シングルチャンネル)型でなければいけません.通常,応答は CV_32SC1 型(分類問題の場合のみ),または CV_32FC1 型の1次元ベクトル(1行または1列)で,1つの入力ベクトル毎に1つの値となります(しかし,ニューラルネットワーク系など,ベクトル型の応答をもつアルゴリズムも存在します).

分類問題での応答は不連続なクラスのラベルであり,回帰問題での応答は近似関数の値です.アルゴリズムによって,分類問題しか扱えないもの,回帰問題しか扱えないもの,両方を扱えるものがあります.後者の場合,出力変数の型は別の引数として渡されるか, var_type ベクトルの最後の要素として渡されます.

  • CV_VAR_CATEGORICAL は,出力値が不連続なクラスラベルであることを意味します.
  • CV_VAR_ORDERED(=CV_VAR_NUMERICAL) は,出力値が連続変数,つまり2つの異なる値が数値として比較できるものであることを意味します.これは回帰問題です.

var_type を用いて,入力変数の型を指定することもできます.多くのアルゴリズムは,入力値として連続変数しか扱うことができません.

ML のモデルの多くは,選択された特徴の部分集合か,学習データセットの選択されたサンプルの部分集合のどちらか,または両方を用いて学習を行う場合があります.これを容易に行うため, train メソッドは通常 var_idxsample_idx という引数を持ちます.前者は注目する変数(特徴)を指定し,後者は注目するサンプルを指定します.これらのベクトルは,整数型 ( CV_32SC1 ) ベクトル(つまり,0基準のインデックスのリスト)か,注目変数/サンプルを示す8ビット ( CV_8UC1 ) マスクです.すべての変数/サンプルを利用して学習を行う場合は,どちらかの引数に NULL ポインタを渡します.

さらに,データ欠損を扱うことができるアルゴリズムも存在します.つまり,ある学習サンプルのある特徴が未知(例えば,患者Aの月曜日の体温を計測し忘れた,というような場合)であることを許容します. train_data と同じサイズの8ビット行列である,パラメータ missing_mask は,(マスクの非0の要素が)欠損値を示すものとして利用されます.

通常,学習を行う前に,モデルの前状態は clear() によってクリアされます.しかし,状態をリセットする代わりに,新しい学習データでモデル状態を更新することを選択できるアルゴリズムも存在します.

cv::CvStatModel::predict

float CvStatMode::predict(const CvMat* sample[, <prediction_params>]) const
サンプルに対する応答を予測します.

このメソッドは,新しいサンプルに対する応答を予測するために利用されます.このメソッドは,分類の場合はクラスラベルを返し,回帰の場合は関数の出力値を返します.入力サンプルは train に渡される train_data と同じ要素数でなければいけません.パラメータ var_idxtrain に渡されると,それが記憶され, predict メソッドで単に入力サンプル中の必要な要素を取り出すために利用されます.

接尾語の「const」は,この予測がモデルの内部状態に影響を与えないことを意味します.したがって,異なるスレッドからこのメソッドを安全に呼び出すことができます.