機械学習 リファレンス マニュアル
- イントロダクション,共通のクラスと関数(Introduction. Common classes and functions)
- ナイーブベイズ(単純ベイズ)分類器(Normal Bayes Classifier)
- K近傍法(K Nearest Neighbors)
- サポートベクターマシン(SVM)
- 決定木(Decision Trees)
- ブースティング(Boosting)
- ランダムツリー(Random Trees)
- EMアルゴリズム(Expectation-Maximization)
- ニューラルネットワーク(Neural Networks)
イントロダクション,共通のクラスと関数(Introduction. Common classes and functions)
Machine Learning Library(MLL)はデータの分類や回帰,クラスタリングに必要な関数とクラスをまとめたものである.
分類と回帰アルゴリズムの多くはC++のクラスとして実装されている. それぞれのアルゴリズムによって異なる特徴(データ欠損(missing measurements)やカテゴリ変数の入力変数に対応できるかどうかなど) を持つが,クラス間には多少の共通部分が存在する.この共通した部分はCvStatModelクラスで定義されており,他の全てのMLクラスはここから派生している.
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を実装する方法はない. しかし以下で述べるように,構文的には多くの類似性があり,その部分はベースクラスに実装されている.
CvStatModel::CvStatModel
デフォルトのコンストラクタ
CvStatModel::CvStatModel();
MLでの各統計モデルのクラスは,パラメータのないデフォルトコンストラクタを持つ.デフォルトコンストラクタに続いて train()またはload() が呼ばれる場合,このコンストラクタは2段階のコンストラクションを行う際に便利である.
CvStatModel::CvStatModel(...)
学習用コンストラクタ
CvStatModel::CvStatModel(const CvMat* train_data ... );
MLのクラスの多くは1段階のコンストラクタと学習用コンストラクタを提供する. このコンストラクタはデフォルトコンストラクタと等価であり,このコンストラクタに渡されたパラメータを引数とする train()メソッドが続けて呼ばれる.
CvStatModel::~CvStatModel
仮想デストラクタ
CvStatModel::~CvStatModel();
基底クラスのデストラクタは仮想関数として宣言されているため,以下のようなコードを書いても安全である.
CvStatModel* model; if( use_svm ) model = new CvSVM(... /* SVMパラメータ */); else model = new CvDTree(... /* 決定木パラメータ */); ... delete model;
一般的に,派生クラスのデストラクタ自身は何もしないが, 全てのメモリを解放するオーバーライドされたメソッドclear()を呼び出す.
CvStatModel::clear
メモリを解放し,モデルの状態をリセットする
void CvStatModel::clear();
メソッドclearは,デストラクタと同等の動作をする. すなわちクラスのメンバによって占有された全てのメモリを解放する. しかしオブジェクトそのものは解放されないので, 後で再利用することもできる. このメソッドはデストラクタや派生クラスのメソッドtrain, load(),read() などから呼ばれる. あるいはユーザが明示的に呼ぶこともできる.
CvStatModel::save
モデルをファイルに保存する
void CvStatModel::save(const char* filename, const char* name=0 );
メソッドsaveは,指定した名前,もしくは(それぞれのクラスに依存する)デフォルトの名前のXMLかYAMLファイルへ,モデルの全状態を保存する. ここではcxcoreのData persistence機能が使われている.
CvStatModel::load
ファイルからモデルを読み込む
void CvStatModel::load(const char* filename, const char* name=0 );
メソッドloadは,指定のXMLかYAMLファイルから指定した名前(もしくはデフォルトのモデルに依存する名前)を持つモデルの全ての状態を読み込む. 以前のモデルの状態はclear()によりクリアされる.
このメソッドは仮想関数なので,あらゆるモデルがこの仮想メソッドを使って読み込み可能であることに注意する. しかし一般的なcvLoad()を使って読み込まれるOpenCVのC言語形式とは異なり, この場合には,空のモデル,適切なクラスのインスタンスを事前に作成しておく必要があるため, モデルの型を知っている必要がある.今後のMLのバージョンでは,この制約を排除する予定である.
CvStatModel::write
モデルをファイルに書き込む
void CvStatModel::write(CvFileStorage* storage, const char* name );
メソッドwriteは,指定した名前,もしくは(それぞれのクラスに依存する)デフォルトの名前を持つモデルの全ての状態をファイルストレージに書き込む. このメソッドはsave()から呼ばれる.
CvStatModel::read
ファイルストレージからモデルを読み込む
void CvStatMode::read(CvFileStorage* storage, CvFileNode* node );
メソッドreadは,モデルの全ての状態をファイルストレージの指定したノードから読み込む. そのノードは例えば,関数cvGetFileNodeByName()を使ってユーザが見つける必要がある. このメソッドはload()から呼ばれる.
以前のモデルの状態はclear() によりクリアされる.
CvStatModel::train
モデルの学習
bool CvStatMode::train(const CvMat* train_data,
[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は,32fC1(32ビット浮動小数点,シングルチャンネル)型でなければならない.
応答は通常,32sC1型(分類問題の場合のみ)または32fC1型の1次元ベクトル(行または列)で,
入力ベクトル一つに対して一つの値を保存する(しかし,ニューラルネット等のいくつかのアルゴリズムでは,応答はベクトルになる).
分類問題では応答は不連続なクラスのラベルであり,回帰問題では応答は近似された関数の値である.
アルゴリズムによって,分類問題しか扱えないもの,回帰問題しか扱えないもの,両方を扱えるものがある.
後者の場合,出力値の型は別のパラメータとして渡されるか,var_typeベクトルの最後の要素として渡される.
CV_VAR_CATEGORICALは,出力値が離散的なクラスのラベルであることを意味する.
CV_VAR_ORDERED(=CV_VAR_NUMERICAL)は,出力値が連続変数であることを意味する.すなわち,2つの異なる値が数として比較可能で,これは回帰問題である.
入力変数の型はvar_typeを用いて指定することもできる.
多くのアルゴリズムは,入力値として連続変数しか扱えない.
MLのモデルの多くは,選択された部分的な特徴と,学習データセットのサンプルの一部の両方かどちらか一つを使って学習される. これを容易に行うため, メソッドtrainは var_idxとsample_idxパラメータを持つ. 前者は注目する変数(特徴)を指定し,後者は注目するサンプルを指定する. これらのベクトルは整数型(32sC1)のベクトル, すなわち0を基準とするインデックスのリストか,注目変数/サンプルを示す8ビット(8uC1)のマスクである. 全ての変数/サンプルを学習に使う場合には,NULLポインタを渡す.
さらに,いくつかのアルゴリズムはデータ欠損を処理することができる. これは,ある学習サンプルのある特徴が欠落した状態を意味する(例えば,患者Aの体温を月曜日に計測し忘れた,というような場合). パラメータmissing_maskはtrain_dataと同じサイズの8ビットの行列で,欠落した値(マスクの非0要素)を示すために使われる. 通常,前のモデルの状態は学習を行う前に clear()でクリアされる. しかし幾つかのアルゴリズムではモデルはクリアされず, 新しい学習データを使って更新することがある.
CvStatModel::predict
サンプルに対する応答を予測する
float CvStatMode::predict(const CvMat* sample[, <prediction_params>] ) const;
このメソッドは新しいサンプルの応答を予測するために使われる. 分類の場合,このメソッドはクラスのラベルを返し,回帰の場合,関数の値を出力する. 入力するサンプルはtrainに渡されるtrain_dataと同じ数のコンポーネントを持っておく必要がある. var_idxパラメータを trainに渡すと, このパラメータは記憶されて,メソッドpredictに入力されたサンプルから必要なコンポーネントを引き出すためだけに使われる.
添字「const」は,予測が内部のモデルの状態に影響しないことを意味する.よってこのメソッドは,別のスレッドから安全に呼び出すことができる.