機械学習 リファレンスマニュアル


イントロダクション,共通のクラスと関数(Introduction. Common classes and functions)

Machine Learning Library(MLL)はデータの分類や回帰、クラスタリングに必要な関数とクラスをまとめたものである。

分類と回帰アルゴリズムの多くはC++のクラスとして実装されている。 それぞれのアルゴリズムによって異なる特徴(データ欠損(missing measurements)やカテゴリ変数の入力変数に対応できるかどうかなど) を持つが、クラス間には多少の共通部分が存在する。この共通した部分はCvStatModelクラスで定義されており、他の全てのMLクラスはここから派生している。



CvStatModel

MLにおける統計モデルのための基底クラス



CvStatModel::CvStatModel();

デフォルトのコンストラクタ



CvStatModel::CvStatModel(const CvMat* train_data ... );

学習用コンストラクタ



CvStatModel::~CvStatModel();

仮想デストラクタ



void CvStatModel::clear();

メモリを解放し、モデルの状態をリセットする



void CvStatModel::save(const char* filename, const char* name=0 );

モデルをファイルに保存する



void CvStatModel::load(const char* filename, const char* name=0 );

ファイルからモデルを読み込む



void CvStatModel::write(CvFileStorage* storage, const char* name );

モデルをファイルに書き込む



void CvStatMode::read(CvFileStorage* storage, CvFileNode* node );

ファイルストレージからモデルを読み込む



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> ... );

モデルの学習



float CvStatMode::predict(const CvMat* sample[, <prediction_params>] ) const;

サンプルに対する応答を予測する


ノーマルベイズ分類器(Normal Bayes Classifier)

これは、各クラスの特徴ベクトルが正規分布である事を仮定した(とはいえ、必ずしも独立に分布している必要はない)単純な分類モデルである。 従って、全てのデータ分布関数は、一つのクラスに対して一つのコンポーネントの混合ガウス分布で表現できると仮定される。 このアルゴリズムは、学習データを用いて各クラスの平均ベクトルと共変動行列を推定し、それらによる予測を行う。

[Fukunaga90] K. Fukunaga. Introduction to Statistical Pattern Recognition. second ed., New York: Academic Press, 1990.



CvNormalBayesClassifier

正規分布データに対するベイズ分類器



bool CvNormalBayesClassifier::train(const CvMat* _train_data, const CvMat* _responses,
               const CvMat* _var_idx = 0, const CvMat* _sample_idx=0, bool update=false );

モデルを学習する



float CvNormalBayesClassifier::predict(const CvMat* samples, CvMat* results=0 ) const;

サンプルに対する応答を予測する


K最近傍(K Nearest Neighbors)

このアルゴリズムでは、まず学習用サンプルを全て取り込み、次に新たに追加されるサンプルの応答を適当な数(K)の近傍を分析(投票や加重和などを使用することが多い)し、予測する。 この手法では、予測のために与えられたベクトルの近傍にある既知の応答を用いて特徴ベクトルを調べるため、「サンプルによる学習(learning by example)」として紹介されることがある。



CvKNearest

K最近傍モデル



bool CvKNearest::train(const CvMat* _train_data, const CvMat* _responses,
                        const CvMat* _sample_idx=0, bool is_regression=false,
                        int _max_k=32, bool _update_base=false );

モデルの学習



float CvKNearest::find_nearest(const CvMat* _samples, int k, CvMat* results=0,
        const float** neighbors=0, CvMat* neighbor_responses=0, CvMat* dist=0 ) const;

入力ベクトルの近傍を探す


サポートベクターマシン(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

サポートベクターマシン



CvSVMParams

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 を学習する



int CvSVM::get_support_vector_count() const;
const float* CvSVM::get_support_vector(int i) const;

サポートベクターの個数と、特定のサポートベクターを取得する


決定木(Decision Trees)

このセクションで議論される ML クラスは、 [Brieman84] で述べられる分類木および回帰木のアルゴリズムを提供する。

CvDTreeクラスは、これ単体で用いられる単一決定木、あるいは決定木集合の基底クラスとして用いられる (BoostingRandom Trees を参照)。

決定木は二分木(つまり、それぞれの葉以外のノードがちょうど二つずつの子ノードを持つような木)である。 木の葉がそれぞれ、あるクラスラベルを持つ(複数の葉が同じラベルを持つこともある)場合には分類に、 木の葉がそれぞれ、定数を持つ場合には回帰に(このような決定木は近似関数とも見なせるが、これは区分的に一定な値(つまり離散値)を出力することになる)、用いられる。

決定木による予測

予測手続きは、ルートノードから開始して葉に到達することで、入力特徴ベクトルに対する応答を得る。 この処理は、ある変数の値を基に、葉ではない各ノードから左(つまり次の観測ノードとして左側の子ノードを選択)、あるいは右に分岐して進む。 そのインデックスは観測ノードに保存される。変数は連続変数、あるいはカテゴリ変数を取り得る。1番目のケース(入力が連続変数)では、 入力された変数値はある閾値(これもノードに保存されている)と比較され、その値が閾値より小さい場合は左に、そうでない場合は右に進む (例えば重さが 1kgよりも軽い場合は左に、重い場合は右に進む)。 そして2番目のケース(入力がカテゴリ変数)では、入力された離散変数値が取りうる値の有限集合の内、ある値の部分集合(これもノードに保存される)に属するかが調べられる。 属している場合は左に、そうでない場合は右に進む(例えば色が緑か赤の場合は左に進み、そうでない場合は右に進む)。 つまり各ノードにおいてエンティティのペア(<variable_index>, <decision_rule (threshold/subset)>)が用いられる。 このペアは、分岐(変数 #<variable_index> による分岐)と呼ばれる。葉ノードに到達すると、そのノードの値が予測の出力値となる。

まれに、入力ベクトルのある特徴が欠損する(例えば、暗い場所ではオブジェクトの色を測定することが困難)と、 予測手続きが、あるノード(前述の例では色で分岐するノードの条件)で行き詰まるかもしれない。 このような状況を回避するために、決定木は、いわゆる代理分岐(surrogate split)を利用する。 つまり最適な「第一」分岐に加えて、決定木の各ノードが、ほぼ同じ結果を与える一つ以上の別の変数によって分岐することがある。

決定木の学習

決定木の構築はルートノードから開始され、再帰的に行われる。 全学習データ(特徴ベクトル、およびそれに対する応答)は、ルートノードを分岐させるために用いられる。 各ノードにおいて、ある基準(機械学習では、分類にはジニ(GINI)「純粋」指標が、回帰には誤差の2乗の和が用いられる)に基づき、 最適な決定規則(つまり、最適な「第一」分岐)が求められる。必要ならば、学習データにおける第一分岐の結果に類似した代理分岐を求める。 すべてのデータは、第一分岐と代理分岐を利用して(まさに予測手続きでされるように)左右の子ノードに分類される。 そして、この分類処理は左右のノードでも再帰的に行われる。以下のいずれかの場合に、各ノードにおける再帰的処理が停止する(つまりノードがそれ以上分岐しない)。

木が構成された後、必要ならば交差検証法(cross-validation)により不要なデータが取り除かれる。 つまり、モデルを過剰適合させてしまうような木の枝が刈られる。この手続きは通常、スタンドアロンな決定木に対してのみ用いられる。 一方、決定木集合の場合は通常、十分に小さい木々を構成することで、過剰適合に対する自身の防護機構が働く。

変数の重要度

決定木は、予測はもちろんの事、他にも様々なデータ解析に利用できる。 ここでキーとなる性質の一つは、決定木のアルゴリズムは各変数の重要度(relative decisive power)が計算できるという事である。 例えばスパムフィルタで、文章中に登場する単語の集合を特徴ベクトルとして用いると、変数の重要度評価は、最も「スパムらしい」 単語を決定するために利用でき、その結果、適切な辞書のサイズを保つのに役立つ。

各変数の重要度は、その変数が通過する木の第一分岐と代理分岐全てを使って計算される。 従って、変数の重要度を正しく計算するためには、たとえデータ欠損がない場合でも、学習パラメータにおいて代理分岐が有効でなければならない。

[Brieman84] Breiman, L., Friedman, J. Olshen, R. and Stone, C. (1984), "Classification and Regression Trees", Wadsworth.



CvDTreeSplit

決定木ノードの分岐



CvDTreeNode

決定木ノード



CvDTreeParams

決定木の学習パラメータ



CvDTreeTrainData

決定木の学習データ、および決定木集合の共有データ



CvDTree

決定木



bool CvDTree::train(const CvMat* _train_data, int _tflag,
                     const CvMat* _responses, const CvMat* _var_idx=0,
                     const CvMat* _sample_idx=0, const CvMat* _var_type=0,
                     const CvMat* _missing_mask=0,
                     CvDTreeParams params=CvDTreeParams() );

bool CvDTree::train(CvDTreeTrainData* _train_data, const CvMat* _subsample_idx );

決定木を学習する



CvDTreeNode* CvDTree::predict(const CvMat* _sample, const CvMat* _missing_data_mask=0,
                               bool raw_mode=false ) const;

入力ベクトルに対する決定木の葉ノードを返す


ブースティング(Boosting)

一般的な機械学習のタスクは、次のような教師あり学習である。 入力と出力の学習データ集合が与えられたときに、未観測の入力サンプル xに対する出力 y を予測する。 つまり、入力 x と出力 y の間の関係を表す関数F: y = F(x) を学習することが目的である。定性的な出力予測が分類と呼ばれるのに対して、定量的な出力予測は回帰と呼ばれる。

ブースティングは教師あり分類の学習タスクを解決する強力な学習概念であり、たくさんの「弱い」分類器の能力を結合することで、 強力な「コミッティ」[HTF01] を構成する。 弱い分類器は、偶然よりもましな性能を持っていれば良いため、非常にシンプルで計算コストの小さいものである。 しかし、これらの多くを上手く結合することで、強力な分類器が構成できる。これは、SVM や ニューラルネットワーク等の「一つの」強力な分類器よりも良い性能を示すことも多い。

決定木は、ブースティングの枠組みに用いられる最も有名な弱い分類器である。一つの木に一つの分類ノードしかない、最も単純な決定木(stump と呼ばれる)で十分な場合が多い。

ブーストされたモデルの学習は、N 個の学習サンプル {(xi,yi,)}1N(ここで、xiRKyi ∈ {−1, +1})に基づいている。 xi は、K 個の成分をもつベクトルである。 それぞれの弱い分類器(コンポーネント)は、現在の学習タスクに関連する特徴をエンコードする。目的の二つのクラスは、−1 と +1 にエンコードされる。

ブースティングの変形として、Discrete Adaboost、Real AdaBoost、LogitBoost、Gentle AdaBoost[FHT98] などが知られている。 これらは全て、全体的な構造が非常に似ているので、以下で説明する標準的な2クラスの Discrete AdaBoost についてのみ見ることにする。 初期状態では、各サンプルに対して同一の重みが与えられる(step 2)。 次に、弱い分類器 fm(x) が重み付き学習データを用いて学習される(step 3-1)。 重み付き学習誤差とスケーリングファクター cmが計算される(step 3-2)。 分類に失敗した学習サンプルの重みが増加する(step 3-3)。 そして、重みが正規化され、次の弱い分類器を求める処理がまた M-1 回繰り返される。 最終的な分類器 F(x) は、個々の弱い分類器出力の重み付き和の符号を出力とする(step 4)。

  1. N 個のサンプルが与えられる {(xi,yi)}1N with xiRK, yi ∈ {−1, +1}.
  2. 重みを付ける wi = 1/N, i = 1,…,N
  3. 繰り返し m = 1,2,…,M:
    1. 分類器 fm(x) ∈ {−1,1}を 重み wi 付きの学習データを用いて学習する。
    2. errm = Ew [1(yfm(x))], cm = log((1 − errm)/errm) を計算する。
    3. wiwi exp[cm 1(yifm(xi))]、 i = 1,2,…,N, となるように各重みを設定し、さらに ∑i wi = 1 となるように再び正規化する。
  4. 分類器の出力 [∑ m = 1M cm fm(x)] の符号。
2クラスの Discrete AdaBoost アルゴリズム:学習(step 1 から 3)と分類(step 4)

注釈: 古典的ブースティング手法と同様に、現在の実装でも2クラス分類器だけをサポートしている。 M>2 のクラスに対しては、[FHT98] で述べられる AdaBoost.MH アルゴリズムが存在する。これは、かなり多くの学習データ集合が必要ではあるものの、問題を2クラス問題に帰着する。

精度を大きく下げることなくブーストモデルの計算時間を減らすために、影響力を考慮したトリミング(influence trimming technique)が用いられることがある。 学習アルゴリズムが進むにつれて集合の決定木の数が増加すると、多くの学習サンプルが正しく分類されて信頼度が増す。 その結果、それらのサンプルは以降の繰り返し計算において小さい重みが付けられる。相対的な重みが非常に小さいサンプルは、弱い学習器の学習においてほとんど影響を与えない。 よって、このようなサンプルは弱い学習器の学習中に排除されるが、最終的に生成される分類器にあまり影響を与えない。 この処理は、パラメータ weight_trim_rate によりコントロールされる。全重みに対して上位 weight_trim_rate の割合を占める重みをもつサンプルだけが、弱い分類器の学習に利用される。全ての学習サンプルに対する重みは、各学習の反復毎に再計算される事に注意する。 ある繰り返しにおいて削除されたサンプルも、別の弱い学習器の学習においては再利用されるかもしれない [FHT98]。

[HTF01] Hastie, T., Tibshirani, R., Friedman, J. H. The Elements of Statistical Learning: Data Mining, Inference, and Prediction. Springer Series in Statistics. 2001.

[FHT98] Friedman, J. H., Hastie, T. and Tibshirani, R. Additive Logistic Regression: a Statistical View of Boosting. Technical Report, Dept. of Statistics, Stanford University, 1998.



CvBoostParams

ブースティングの学習パラメータ



CvBoostTree

弱い決定木



CvBoost

ブーストされた分類器



bool CvBoost::train(const CvMat* _train_data, int _tflag,
             const CvMat* _responses, const CvMat* _var_idx=0,
             const CvMat* _sample_idx=0, const CvMat* _var_type=0,
             const CvMat* _missing_mask=0,
             CvBoostParams params=CvBoostParams(),
             bool update=false );

ブーストされた分類器の学習



float CvBoost::predict(const CvMat* sample, const CvMat* missing=0,
                        CvMat* weak_responses=0, CvSlice slice=CV_WHOLE_SEQ,
                        bool raw_mode=false ) const;

入力サンプルに対する応答を予測する



void CvBoost::prune(CvSlice slice );

指定された弱い決定木を削除する



CvSeq* CvBoost::get_weak_predictors();

弱い分類器のシーケンスを返す


ランダムツリー(Random Trees)

ランダムツリーは、Leo Breiman と Adele Cutlerによって発表された。 http://www.stat.berkeley.edu/users/breiman/RandomForests/. このアルゴリズムは、分類と回帰問題の両方を扱うことができる。ランダムツリーは tree predictors の集合(集合体)であり、 このセクション以降では forest(この言葉も Breiman によって発表された)と呼ばれる。分類は次のように行われる。 ランダムツリー分類器は入力である特徴ベクトルを取り込み、forestの中の全てのツリーでそれらを分類し、多くの投票を得たクラスのラベルを出力する。 回帰の場合、分類器の応答はforestの全てのツリーの応答の平均である。

すべてのツリーは同じパラメータで学習されるが、そこで用いられるデータ集合はブートストラップ法によって元データから生成され、各ツリーで異なる。 それぞれの学習用データのために、ランダムに同じ数のベクトルをオリジナルデータの集合(=N)から選択する。このベクトルは、置換を伴って選択される。 つまり、複数回使用されるベクトルもあれば、まったく使用されないベクトルもある。 学習済みの各ツリーの各ノードにおいて、最適な分岐を見つけるのためには、すべての変数ではなくランダムに選択されたその部分集合のみを用いる。 それぞれのノードで新しい部分集合が生成されるが、そのサイズは全てのノードおよび全てのツリーについて固定である。 これは学習パラメータであり、デフォルトではsqrt(<number_of_variables>)である。学習後のツリーでは、枝の刈り込みは行われない。

ランダムツリーにおいて、交差検証法やブートストラップ法などの正確な推定手法、あるいは、学習誤差を評価するためのセパレートテストセットは必要ではない。 誤差は、学習中に内部で評価される。現在のツリーのための学習集合が置換を伴うサンプリングによって抽出される際に、いくらかのベクトルは除外される (いわゆるoob (out-of-bag) データである)。oob データのサイズは約 N/3である. 分類誤差は以下のようにoob-dataを使用することによって評価される。

参考文献

  1. Machine Learning, Wald I, July 2002
  2. Looking Inside the Black Box, Wald II, July 2002
  3. Software for the Masses, Wald III, July 2002
  4. And other articles from the web-site http://www.stat.berkeley.edu/users/breiman/RandomForests/cc_home.htm.



CvRTParams

ランダムツリーの学習パラメータ



CvRTrees

ランダムツリー



bool CvRTrees::train(const CvMat* train_data, int tflag,
                    const CvMat* responses, const CvMat* comp_idx=0,
                    const CvMat* sample_idx=0, const CvMat* var_type=0,
                    const CvMat* missing_mask=0,
                    CvRTParams params=CvRTParams() );

ランダムツリーモデルの学習



double CvRTrees::predict(const CvMat* sample, const CvMat* missing=0 ) const;

入力サンプルに対する出力を予測する



const CvMat* CvRTrees::get_var_importance() const;

変数の重要度を表す配列を取得する



float CvRTrees::get_proximity(const CvMat* sample_1, const CvMat* sample_2 ) const;

二つの学習サンプル間の近さを取り出す


EMアルゴリズム(Expectation-Maximization)

EM(Expectation-Maximization)アルゴリズムは、混合数が指定されたガウス混合分布に基づき、多変量の確率密度関数のパラメータを推定する。

特徴ベクトル{x1, x2,...,xN} の集合を考える。 d次元ユークリッド空間のN個のベクトルは、混合ガウス分布を用いて以下のように表現される。

ここでmは混合数、pk は、平均ak、共分散行列Sk、 k-th分布の重みπkを持つ正規分布密度である。 混合数mとサンプル{xi, i=1..N}を与えることで、アルゴリズムはすべての混合分布パラメータ (すなわち、 akSkπk) の最尤推定値(MLE) を以下のように推定する。

EMアルゴリズムは繰り返し処理を行う。各繰り返し処理には二つのステップを含む. 第1ステップ(Expectation-step、または E-step)では、混合分布#kに属するサンプル#iの確率 pi,k(以下の式では αi,k で表される)を、 その時点の混合分布パラメータの推定値を用いて以下のように求める。

第2ステップ(Maximization-step、 またはM-step)では以下のように、混合分布パラメータ推定値が、計算された確率を用いて高精度化される。

pi,k の初期値が与えられる場合、アルゴリズムはM-stepから始めてもよい。 また、pi,kがわからない場合は、入力サンプルをあらかじめクラスタリングし、pi,kの初期値を求めるために、 シンプルなクラスタリングアルゴリズムを使用する。このような場合(MLも含む)、 k-meansアルゴリズムがよく用いられる。

EMアルゴリズムが扱うべき問題の一つが、膨大な推定パラメータの数である。 パラメータの大多数は共変動行列で表されており、それぞれd×dの要素(ここで、dは特徴空間の次元数である)を持つ。 しかし、実際は、共変動行列のほとんどが対角行列であり、さらにμk*IIは単位行列、μk は混合分布に依存する「スケール」パラメータ)に非常に近い。 従って、ロバストな計算を行うために、共変動行列により強い制約条件を付けた状態で計算を開始し、 そこで推定されたパラメータを入力として、弱い制約条件下での最適化問題を解く(対角共変動行列は、既に十分な精度の近似値になっていることが多い)。

参考文献

  1. [Bilmes98] J. A. Bilmes. A Gentle Tutorial of the EM Algorithm and its Application to Parameter Estimation for Gaussian Mixture and Hidden Markov Models. Technical Report TR-97-021, International Computer Science Institute and Computer Science Division, University of California at Berkeley, April 1998.



CvEMParams

EMアルゴリズムのパラメータ



CvEM

EM モデル



void CvEM::train(const CvMat* samples, const CvMat*  sample_idx=0,
                  CvEMParams params=CvEMParams(), CvMat* labels=0 );

サンプル集合からガウス混合パラメータを推定する


ニューラルネットワーク(Neural Networks)

MLでは、フィードフォワードのニューラルネットワークが用意されている。 これは多層構造のパーセプトロン(MLP:multi-layer perceptrons)であり、最も一般的に使われるニューラルネットワークである。 MLPは入力層と出力層、そして一つまたは複数の中間層から構成される。 MLPのそれぞれの層は一つまたは複数のニューロンを含んでおり、前の層と次の層のニューロンが一方向に繋がれている。

MLPの全てのニューロンは類似している。 それらは幾つかの入力リンク(つまり前のレイヤーにある幾つかのニューロンからの出力値を入力として受け取る)と、 幾つかの出力リンク(つまり次のレイヤーの幾つかのニューロンに応答を渡す)を持つ。 前の層から受け取った値は、各ニューロン間のリンクで異なる幾らかの重みを掛けて足され、さらにバイアス項を足し合わされて、 その合計値がニューロンによって異なる活性化関数fによって変換される。

言い換えれば、レイヤーnの出力{xj}を与えた時、 レイヤーn+1の出力{yi}は次のように計算される。

    ui=sumj(w(n+1)i,j*xj) + w(n+1)i,bias
    yi=f(ui)

異なった活性化関数が使われることもあり、MLでは標準的な3つの関数が実装されている。

MLでは、すべてのニューロンは、ユーザが指定した同じフリーパラメータ(α,β)を持つ同じ活性化関数を使い、学習アルゴリズムによって変化しない。

そのため、学習済みのネットワークは全て次のように動作する。 入力として特徴ベクトルが必要で、そのベクトルのサイズは入力層のサイズと同じである。 値が最初の中間層に入力として渡されると、重みと活性化関数を使って中間層の出力が計算され、それが出力層に届くまで次々と下の層に流されてゆく。

従って、ネットワークを構築するためには、すべての重みw(n+1)i,jを知る必要がある。 重みは学習アルゴリズムによって計算される。このアルゴリズムは学習集合(複数の入力ベクトルとそれに対応する複数の出力ベクトル)を必要とし、 与えられた入力ベクトルに応じて期待通りの応答を出力するように、ネットワークの重みを繰り返し調節する。

ネットワークのサイズ(中間層の数とそれらのサイズ)が大きくなれば、ネットワークの柔軟性も増し、学習データセットでの誤差も小さくできるかもしれない。 しかし同時に、この学習済みネットワークは学習データセットに存在するノイズ自体も「学習」してしまい、通常、ネットワークサイズがある程度の限界に達すると、 テストセットの誤差も増加し始める。 さらに、大きなネットワークでは小さいものと比較して学習に時間がかかるため、データの前処理 (PCAやそれに類似した手法を使う)を行い、 小さなネットワークに本質的な特徴のみを学習させる。

MLPの他の特徴として、カテゴリ変数データをそのままでは取り扱えないという問題があるが、これには回避策がある。 入力層、あるいは出力層(つまり、n>2に対するn-クラス分類器の場合)における特徴がカテゴリ変数であり、 異なるM個(>2)の値を扱うことができるとすると、その特徴がとりうるM個の値のうちi番目の値と等しい場合にのみ、 i番目の要素が1となるようなM個要素の2値タプルとして表現できる。これは入力/出力層のサイズを増加させるが、学習アルゴリズムの収束を高速化し、 同時に「曖昧」な値、例えば固定値の代わりに確率の組を使うようなことを可能にする。

MLでは学習MLPのために二つのアルゴリズムが実装されている。 一つは古典的なランダムで逐次的な逆伝播アルゴリズムであり、 もう一つは、一括RPROPアルゴリズム(デフォルト)である。

参考文献

  1. http://en.wikipedia.org/wiki/Backpropagation. Wikipedia article about the backpropagation algorithm.
  2. Y. LeCun, L. Bottou, G.B. Orr and K.-R. Muller, "Efficient backprop", in Neural Networks---Tricks of the Trade, Springer Lecture Notes in Computer Sciences 1524, pp.5-50, 1998.
  3. M. Riedmiller and H. Braun, "A Direct Adaptive Method for Faster Backpropagation Learning: The RPROP Algorithm", Proc. ICNN, San Fransisco (1993).



CvANN_MLP_TrainParams

MLP学習アルゴリズムのパラメータ



CvANN_MLP

MLPモデル



void CvANN_MLP::create(const CvMat* _layer_sizes,
                        int _activ_func=SIGMOID_SYM,
                        double _f_param1=0, double _f_param2=0 );

指定したトポロジーでMLPを構築する



int CvANN_MLP::train(const CvMat* _inputs, const CvMat* _outputs,
                      const CvMat* _sample_weights, const CvMat* _sample_idx=0,
                      CvANN_MLP_TrainParams _params = CvANN_MLP_TrainParams(),
                      int flags=0 );

MLPの学習と更新

OpenCVリファレンスマニュアル


CV_RGB
CV_TREE_NODE_FIELDS
CvANN_MLP
CvANN_MLP_TrainParams
CvANN_MLP::create
CvANN_MLP::train
CvArr
CvAttrList
CvBoost
CvBoostParams
CvBoostTree
CvBoost::get_weak_predictors
CvBoost::predict
CvBoost::prune
CvBoost::train
CvBox2D
CvCapture
CvConnectedComp
CvConvexityDefect
CvDTree
CvDTreeNode
CvDTreeParams
CvDTreeSplit
CvDTreeTrainData
CvDTree::predict
CvDTree::train
CvEM
CvEMParams
CvEM::train
CvFileNode
CvFileStorage
CvGraph
CvGraphScanner
CvHaarClassifier
CvHaarClassifierCascade
CvHaarFeature
CvHaarStageClassifier
CvHistogram
CvKNearest
CvKNearest::find_nearest
CvKNearest_train
CvKalman
CvMat
CvMatND
CvMemBlock
CvMemStorage
CvMemStoragePos
CvNormalBayesClassifier
CvNormalBayesClassifier::predict
CvNormalBayesClassifier::train
CvPoint
CvPoint2D32f
CvPoint2D64f
CvPoint3D32f
CvPoint3D64f
CvQuadEdge2D
CvRTParams
CvRTrees
CvRTrees::get_proximity
CvRTrees::get_var_importance
CvRTrees::predict
CvRTrees::train
CvRect
CvSVM
CvSVMParams
CvSVM::get_support_vector
CvSVM::train
CvScalar
CvSeq
CvSeqBlock
CvSet
CvSize
CvSize2D32f
CvSlice
CvSparseMat
CvStatModel
CvStatModel::CvStatModel
CvStatModel::clear
CvStatModel::CvStatModel(data)
CvStatModel::~CvStatModel
CvStatModel::load
CvStatModel::predict
CvStatModel::read
CvStatModel::save
CvStatModel::train
CvStatModel::write
CvSubdiv2D
CvSubdiv2DPoint
CvTermCriteria
CvTreeNodeIterator
CvTypeInfo
IplImage
RTreesOOBerror
cv2DRotationMatrix
cvAbsDiff
cvAbsDiffS
cvAcc
cvAdaptiveThreshold
cvAdd
cvAddS
cvAddWeighted
cvAlloc
cvAnd
cvAndS
cvApproxChains
cvApproxPoly
cvArcLength
cvAvg
cvAvgSdv
cvBackProjectPCA
cvBoundingRect
cvBoxPoints
cvCalcBackProject
cvCalcBackProjectPatch
cvCalcCovarMatrix
cvCalcEMD2
cvCalcGlobalOrientation
cvCalcHist
cvCalcImageHomography
cvCalcMotionGradient
cvCalcOpticalFlowBM
cvCalcOpticalFlowHS
cvCalcOpticalFlowLK
cvCalcOpticalFlowPyrLK
cvCalcPCA
cvCalcPGH
cvCalcProbDensity
cvCalcSubdivVoronoi2D
cvCalibrateCamera2
cvCamShift
cvCanny
cvCartToPolar
cvCbrt
cvCheckArr
cvCheckContourConvexity
cvCircle
cvClearGraph
cvClearHist
cvClearMemStorage
cvClearND
cvClearSeq
cvClearSet
cvClearSubdivVoronoi2D
cvClipLine
cvClone
cvCloneGraph
cvCloneImage
cvCloneMat
cvCloneMatND
cvCloneSeq
cvCloneSparseMat
cvCmp
cvCmpS
cvCompareHist
cvComputeCorrespondEpilines
cvConDensInitSampleSet
cvConDensUpdateByTime
cvContourArea
cvContourFromContourTree
cvConvert
cvConvertImage
cvConvertPointsHomogenious
cvConvertScale
cvConvertScaleAbs
cvConvexHull2
cvConvexityDefects
cvCopy
cvCopyHist
cvCopyMakeBorder
cvCornerEigenValsAndVecs
cvCornerHarris
cvCornerMinEigenVal
cvCountNonZero
cvCreateCameraCapture
cvCreateChildMemStorage
cvCreateConDensation
cvCreateContourTree
cvCreateData
cvCreateFileCapture
cvCreateGraph
cvCreateGraphScanner
cvCreateHist
cvCreateImage
cvCreateImageHeader
cvCreateKalman
cvCreateMat
cvCreateMatHeader
cvCreateMatND
cvCreateMatNDHeader
cvCreateMemStorage
cvCreatePOSITObject
cvCreateSeq
cvCreateSet
cvCreateSparseMat
cvCreateStructuringElementEx
cvCreateSubdivDelaunay2D
cvCreateTrackbar
cvCreateVideoWriter
cvCrossProduct
cvCvtColor
cvCvtScale
cvCvtSeqToArray
cvDCT
cvDFT
cvDecRefData
cvDestroyAllWindows
cvDestroyWindow
cvDet
cvDilate
cvDistTransform
cvDiv
cvDotProduct
cvDrawChessBoardCorners
cvDrawContours
cvEigenVV
cvEllipse
cvEllipse2Poly
cvEllipseBox
cvEndFindContours
cvEndWriteSeq
cvEndWriteStruct
cvEqualizeHist
cvErode
cvError
cvErrorStr
cvExp
cvFastArctan
cvFillConvexPoly
cvFillPoly
cvFilter2D
cvFindChessboardCorners
cvFindContours
cvFindCornerSubPix
cvFindExtrinsicCameraParams2
cvFindFundamentalMat
cvFindGraphEdge
cvFindGraphEdgeByPtr
cvFindHomography
cvFindNearestPoint2D
cvFindNextContour
cvFindType
cvFirstType
cvFitEllipse2
cvFitLine2D
cvFlip
cvFloodFill
cvFlushSeqWriter
cvFree
cvGEMM
cvGet1D
cvGet2D
cvGet3D
cvGetND
cvGetAffineTransform
cvGetCaptureProperty
cvGetCentralMoment
cvGetCol
cvGetDiag
cvGetDims
cvGetElemType
cvGetErrMode
cvGetErrStatus
cvGetFileNode
cvGetFileNodeByName
cvGetFileNodeName
cvGetGraphVtx
cvGetHashedKey
cvGetHistValue_1D
cvGetHistValue_2D
cvGetHistValue_3D
cvGetHistValue_nD
cvGetHuMoments
cvGetImage
cvGetImageCOI
cvGetImageROI
cvGetMat
cvGetMinMaxHistValue
cvGetModuleInfo
cvGetNextSparseNode
cvGetNormalizedCentralMoment
cvGetNumThreads
cvGetOptimalDFTSize
cvGetPerspectiveTransform
cvGetQuadrangleSubPix
cvGetRawData
cvGetReal1D
cvGetReal2D
cvGetReal3D
cvGetRealND
cvGetRectSubPix
cvGetRootFileNode
cvGetRow
cvGetSeqElem
cvGetSeqReaderPos
cvGetSetElem
cvGetSize
cvGetSpatialMoment
cvGetSubRect
cvGetTextSize
cvGetThreadNum
cvGetTickCount
cvGetTickFrequency
cvGetTrackbarPos
cvGetWindowHandle
cvGetWindowName
cvGoodFeaturesToTrack
cvGrabFrame
cvGraphAddEdge
cvGraphAddEdgeByPtr
cvGraphAddVtx
cvGraphEdgeIdx
cvGraphRemoveEdge
cvGraphRemoveEdgeByPtr
cvGraphRemoveVtx
cvGraphRemoveVtxByPtr
cvGraphVtxDegree
cvGraphVtxDegreeByPtr
cvGraphVtxIdx
cvGuiBoxReport
cvHaarDetectObjects
cvHoughCircles
cvHoughLines2
cvInRange
cvInRangeS
cvIncRefData
cvInitFont
cvInitImageHeader
cvInitLineIterator
cvInitMatHeader
cvInitMatNDHeader
cvInitSparseMatIterator
cvInitSystem
cvInitTreeNodeIterator
cvInitUndistortMap
cvInpaint
cvInsertNodeIntoTree
cvIntegral
cvInvSqrt
cvInvert
cvIsInf
cvIsNaN
cvKMeans2
cvKalmanCorrect
cvKalmanPredict
cvLUT
cvLaplace
cvLine
cvLoad
cvLoadHaarClassifierCascade
cvLoadImage
cvLog
cvLogPolar
cvMahalonobis
cvMakeHistHeaderForArray
cvMakeSeqHeaderForArray
cvMat
cvMatchContourTrees
cvMatchShapes
cvMatchTemplate
cvMax
cvMaxRect
cvMaxS
cvMeanShift
cvMemStorageAlloc
cvMemStorageAllocString
cvMerge
cvMin
cvMinAreaRect2
cvMinEnclosingCircle
cvMinMaxLoc
cvMinS
cvMixChannels
cvMoments
cvMorphologyEx
cvMoveWindow
cvMul
cvMulSpectrums
cvMulTransposed
cvMultiplyAcc
cvNamedWindow
cvNextGraphItem
cvNextTreeNode
cvNorm
cvNormalize
cvNormalizeHist
cvNot
cvNulDevReport
cvOpenFileStorage
cvOr
cvOrS
cvPOSIT
cvPerspectiveTransform
cvPointPolygonTest
cvPointSeqFromMat
cvPolarToCart
cvPolyLine
cvPow
cvPreCornerDetect
cvPrevTreeNode
cvProjectPCA
cvProjectPoints2
cvPtr1D
cvPtr2D
cvPtr3D
cvPtrND
cvPutText
cvPyrDown
cvPyrMeanShiftFiltering
cvPyrSegmentation
cvPyrUp
cvQueryFrame
cvQueryHistValue_1D
cvQueryHistValue_2D
cvQueryHistValue_3D
cvQueryHistValue_nD
cvRNG
cvRandArr
cvRandInt
cvRandReal
cvRandShuffle
cvRange
cvRead
cvReadByName
cvReadChainPoint
cvReadInt
cvReadIntByName
cvReadRawData
cvReadRawDataSlice
cvReadReal
cvReadRealByName
cvReadString
cvReadStringByName
cvRectangle
cvRedirectError
cvReduce
cvRegisterModule
cvRegisterType
cvRelease
cvReleaseCapture
cvReleaseConDensation
cvReleaseData
cvReleaseFileStorage
cvReleaseGraphScanner
cvReleaseHaarClassifierCascade
cvReleaseHist
cvReleaseImage
cvReleaseImageHeader
cvReleaseKalman
cvReleaseMat
cvReleaseMatND
cvReleaseMemStorage
cvReleasePOSITObject
cvReleaseSparseMat
cvReleaseStructuringElement
cvReleaseVideoWriter
cvRemap
cvRemoveNodeFromTree
cvRepeat
cvResetImageROI
cvReshape
cvReshapeMatND
cvResize
cvResizeWindow
cvRestoreMemStoragePos
cvRetrieveFrame
cvRodrigues2
cvRound
cvRunHaarClassifierCascade
cvRunningAvg
cvSVBkSb
cvSVD
cvSampleLine
cvSave
cvSaveImage
cvSaveMemStoragePos
cvScale
cvScaleAdd
cvSegmentMotion
cvSeqElemIdx
cvSeqInsert
cvSeqInsertSlice
cvSeqInvert
cvSeqPartition
cvSeqPop
cvSeqPopFront
cvSeqPopMulti
cvSeqPush
cvSeqPushFront
cvSeqPushMulti
cvSeqRemove
cvSeqRemoveSlice
cvSeqSearch
cvSeqSlice
cvSeqSort
cvSet
cvSet1D
cvSet2D
cvSet3D
cvSetND
cvSetAdd
cvSetCaptureProperty
cvSetData
cvSetErrMode
cvSetErrStatus
cvSetHistBinRanges
cvSetIPLAllocators
cvSetIdentity
cvSetImageCOI
cvSetImageROI
cvSetImagesForHaarClassifierCascade
cvSetMemoryManager
cvSetMouseCallback
cvSetNew
cvSetNumThreads
cvSetReal1D
cvSetReal2D
cvSetReal3D
cvSetRealND
cvSetRemove
cvSetRemoveByPtr
cvSetSeqBlockSize
cvSetSeqReaderPos
cvSetTrackbarPos
cvSetZero
cvShowImage
cvSmooth
cvSnakeImage
cvSobel
cvSolveCubic
cvSplit
cvSqrt
cvSquareAcc
cvStartAppendToSeq
cvStartFindContours
cvStartNextStream
cvStartReadChainPoints
cvStartReadRawData
cvStartReadSeq
cvStartWriteSeq
cvStartWriteStruct
cvStdErrReport
cvSub
cvSubRS
cvSubS
cvSubdiv2DEdgeDst
cvSubdiv2DEdgeOrg
cvSubdiv2DGetEdge
cvSubdiv2DLocate
cvSubdiv2DRotateEdge
cvSubdivDelaunay2DInsert
cvSubstituteContour
cvSum
cvThreshHist
cvThreshold
cvTrace
cvTransform
cvTranspose
cvTreeToNodeSeq
cvTypeOf
cvUndistort2
cvUnregisterType
cvUpdateMotionHistory
cvUseOptimized
cvWaitKey
cvWarpAffine
cvWarpPerspective
cvWatershed
cvWrite
cvWriteComment
cvWriteFileNode
cvWriteFrame
cvWriteInt
cvWriteRawData
cvWriteReal
cvWriteString
cvXor
cvXorS
cvmGet
cvmSet
error_handling_sample
error_macros