機械学習 リファレンスマニュアル
イントロダクション,共通のクラスと関数(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クラスは、これ単体で用いられる単一決定木、あるいは決定木集合の基底クラスとして用いられる (Boosting と Random Trees を参照)。
決定木は二分木(つまり、それぞれの葉以外のノードがちょうど二つずつの子ノードを持つような木)である。 木の葉がそれぞれ、あるクラスラベルを持つ(複数の葉が同じラベルを持つこともある)場合には分類に、 木の葉がそれぞれ、定数を持つ場合には回帰に(このような決定木は近似関数とも見なせるが、これは区分的に一定な値(つまり離散値)を出力することになる)、用いられる。
決定木による予測
予測手続きは、ルートノードから開始して葉に到達することで、入力特徴ベクトルに対する応答を得る。 この処理は、ある変数の値を基に、葉ではない各ノードから左(つまり次の観測ノードとして左側の子ノードを選択)、あるいは右に分岐して進む。 そのインデックスは観測ノードに保存される。変数は連続変数、あるいはカテゴリ変数を取り得る。1番目のケース(入力が連続変数)では、 入力された変数値はある閾値(これもノードに保存されている)と比較され、その値が閾値より小さい場合は左に、そうでない場合は右に進む (例えば重さが 1kgよりも軽い場合は左に、重い場合は右に進む)。 そして2番目のケース(入力がカテゴリ変数)では、入力された離散変数値が取りうる値の有限集合の内、ある値の部分集合(これもノードに保存される)に属するかが調べられる。 属している場合は左に、そうでない場合は右に進む(例えば色が緑か赤の場合は左に進み、そうでない場合は右に進む)。 つまり各ノードにおいてエンティティのペア(<variable_index>, <decision_rule (threshold/subset)>)が用いられる。 このペアは、分岐(変数 #<variable_index> による分岐)と呼ばれる。葉ノードに到達すると、そのノードの値が予測の出力値となる。
まれに、入力ベクトルのある特徴が欠損する(例えば、暗い場所ではオブジェクトの色を測定することが困難)と、 予測手続きが、あるノード(前述の例では色で分岐するノードの条件)で行き詰まるかもしれない。 このような状況を回避するために、決定木は、いわゆる代理分岐(surrogate split)を利用する。 つまり最適な「第一」分岐に加えて、決定木の各ノードが、ほぼ同じ結果を与える一つ以上の別の変数によって分岐することがある。
決定木の学習
決定木の構築はルートノードから開始され、再帰的に行われる。
全学習データ(特徴ベクトル、およびそれに対する応答)は、ルートノードを分岐させるために用いられる。
各ノードにおいて、ある基準(機械学習では、分類にはジニ(GINI)「純粋」指標が、回帰には誤差の2乗の和が用いられる)に基づき、
最適な決定規則(つまり、最適な「第一」分岐)が求められる。必要ならば、学習データにおける第一分岐の結果に類似した代理分岐を求める。
すべてのデータは、第一分岐と代理分岐を利用して(まさに予測手続きでされるように)左右の子ノードに分類される。
そして、この分類処理は左右のノードでも再帰的に行われる。以下のいずれかの場合に、各ノードにおける再帰的処理が停止する(つまりノードがそれ以上分岐しない)。
- 木の枝の深さが指定した最大値に到達した場合。
- ノードの学習サンプル数が指定した閾値以下、つまり、そのサンプルがノードをさらに分岐させるための統計的な代表集合ではない場合。
- ノードの全サンプルが同じクラスに属する(あるいは回帰の場合、分散が非常に小さい)場合。
- その第一分岐が、単なるランダム選択と同程度の効果しか示さない場合。
木が構成された後、必要ならば交差検証法(cross-validation)により不要なデータが取り除かれる。 つまり、モデルを過剰適合させてしまうような木の枝が刈られる。この手続きは通常、スタンドアロンな決定木に対してのみ用いられる。 一方、決定木集合の場合は通常、十分に小さい木々を構成することで、過剰適合に対する自身の防護機構が働く。
変数の重要度
決定木は、予測はもちろんの事、他にも様々なデータ解析に利用できる。 ここでキーとなる性質の一つは、決定木のアルゴリズムは各変数の重要度(relative decisive power)が計算できるという事である。 例えばスパムフィルタで、文章中に登場する単語の集合を特徴ベクトルとして用いると、変数の重要度評価は、最も「スパムらしい」 単語を決定するために利用でき、その結果、適切な辞書のサイズを保つのに役立つ。
各変数の重要度は、その変数が通過する木の第一分岐と代理分岐全てを使って計算される。 従って、変数の重要度を正しく計算するためには、たとえデータ欠損がない場合でも、学習パラメータにおいて代理分岐が有効でなければならない。
★
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(ここで、xi ∈ RK、 yi ∈ {−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)。
- N 個のサンプルが与えられる {(xi,yi)}1N with xi ∈ RK, yi ∈ {−1, +1}.
- 重みを付ける wi = 1/N, i = 1,…,N。
- 繰り返し m = 1,2,…,M:
- 分類器 fm(x) ∈ {−1,1}を 重み wi 付きの学習データを用いて学習する。
- errm = Ew [1(y ≠ fm(x))], cm = log((1 − errm)/errm) を計算する。
- wi ← wi exp[cm 1(yi ≠ fm(xi))]、 i = 1,2,…,N, となるように各重みを設定し、さらに ∑i wi = 1 となるように再び正規化する。
- 分類器の出力 [∑ m = 1M cm fm(x)] の符号。
注釈: 古典的ブースティング手法と同様に、現在の実装でも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を使用することによって評価される。
- i番目のツリーに関係するobbである各ベクトルに対する予測を、そのi番目のツリーを使用して得る。
- すべてのツリーの学習後、oobであった各ベクトルに対する class-"winner" (つまり、oobのベクトルを用いたときに、最も多くの投票を得ることができたクラス)を見つける。そして、これを真値と比較する。
- その後、分類誤差の評価値は、元データのすべてのベクトルに対する、誤って分類したoobベクトルの割合として計算される. 回帰の場合、oob誤差は、oobベクトルの予測の和をベクトルの総数で割った値と真値との平方誤差として計算される。
参考文献
★
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個のベクトルは、混合ガウス分布を用いて以下のように表現される。
EMアルゴリズムが扱うべき問題の一つが、膨大な推定パラメータの数である。 パラメータの大多数は共変動行列で表されており、それぞれd×dの要素(ここで、dは特徴空間の次元数である)を持つ。 しかし、実際は、共変動行列のほとんどが対角行列であり、さらにμk*I (Iは単位行列、μk は混合分布に依存する「スケール」パラメータ)に非常に近い。 従って、ロバストな計算を行うために、共変動行列により強い制約条件を付けた状態で計算を開始し、 そこで推定されたパラメータを入力として、弱い制約条件下での最適化問題を解く(対角共変動行列は、既に十分な精度の近似値になっていることが多い)。
参考文献
★
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つの関数が実装されている。
- 恒等関数(CvANN_MLP::IDENTITY): f(x)=x
- 対称性を持つシグモイド関数(CvANN_MLP::SIGMOID_SYM): f(x)=β*(1-e-αx)/(1+e-αx), MLPにおけるデフォルトの選択。
- ガウス関数(CvANN_MLP::GAUSSIAN): f(x)=βe-αx*x, 現時点では完全にはサポートされていない。
MLでは、すべてのニューロンは、ユーザが指定した同じフリーパラメータ(α,β)を持つ同じ活性化関数を使い、学習アルゴリズムによって変化しない。
そのため、学習済みのネットワークは全て次のように動作する。 入力として特徴ベクトルが必要で、そのベクトルのサイズは入力層のサイズと同じである。 値が最初の中間層に入力として渡されると、重みと活性化関数を使って中間層の出力が計算され、それが出力層に届くまで次々と下の層に流されてゆく。
従って、ネットワークを構築するためには、すべての重みw(n+1)i,jを知る必要がある。 重みは学習アルゴリズムによって計算される。このアルゴリズムは学習集合(複数の入力ベクトルとそれに対応する複数の出力ベクトル)を必要とし、 与えられた入力ベクトルに応じて期待通りの応答を出力するように、ネットワークの重みを繰り返し調節する。
ネットワークのサイズ(中間層の数とそれらのサイズ)が大きくなれば、ネットワークの柔軟性も増し、学習データセットでの誤差も小さくできるかもしれない。 しかし同時に、この学習済みネットワークは学習データセットに存在するノイズ自体も「学習」してしまい、通常、ネットワークサイズがある程度の限界に達すると、 テストセットの誤差も増加し始める。 さらに、大きなネットワークでは小さいものと比較して学習に時間がかかるため、データの前処理 (PCAやそれに類似した手法を使う)を行い、 小さなネットワークに本質的な特徴のみを学習させる。
MLPの他の特徴として、カテゴリ変数データをそのままでは取り扱えないという問題があるが、これには回避策がある。 入力層、あるいは出力層(つまり、n>2に対するn-クラス分類器の場合)における特徴がカテゴリ変数であり、 異なるM個(>2)の値を扱うことができるとすると、その特徴がとりうるM個の値のうちi番目の値と等しい場合にのみ、 i番目の要素が1となるようなM個要素の2値タプルとして表現できる。これは入力/出力層のサイズを増加させるが、学習アルゴリズムの収束を高速化し、 同時に「曖昧」な値、例えば固定値の代わりに確率の組を使うようなことを可能にする。
MLでは学習MLPのために二つのアルゴリズムが実装されている。 一つは古典的なランダムで逐次的な逆伝播アルゴリズムであり、 もう一つは、一括RPROPアルゴリズム(デフォルト)である。
参考文献
★
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の学習と更新