OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
機械学習の概要

学習データ

機械学習アルゴリズムには学習データという概念がある。学習データは複数の要素から構成される。

  • 学習サンプルの集合。各学習サンプルは値のベクトルである(コンピュータビジョンでは特徴ベクトルと呼ばれることもある)。通常、すべてのベクトルは同じ数の成分(特徴)を持つ。OpenCV ml モジュールはこれを前提とする。各特徴は順序付き(すなわち値が浮動小数点数で互いに比較でき、厳密に順序付け、つまりソートできる)であるか、カテゴリ型(すなわち値が整数や文字列などの固定された値の集合に属する)のいずれかである。
  • サンプルに対応する応答(レスポンス)の集合(省略可能)。応答を持たない学習データは、異なるサンプル間の距離に基づいて与えられたデータの構造を学習する教師なし学習アルゴリズムで使われる。応答を持つ学習データは、サンプルから応答への写像関数を学習する教師あり学習アルゴリズムで使われる。通常、応答はスカラ値であり、順序付き(回帰問題を扱う場合)またはカテゴリ型(分類問題を扱う場合。この場合、応答はしばしば「ラベル」と呼ばれる)である。一部のアルゴリズム、特にニューラルネットワークは、スカラだけでなく多次元やベクトルの応答も扱える。
  • もう1つの省略可能な要素は、欠測値のマスクである。ほとんどのアルゴリズムはすべての学習サンプルのすべての要素が有効であることを要求するが、決定木などの一部のアルゴリズムは欠測値の場合も扱える。
  • In the case of classification problem user may want to give different weights to different classes. This is useful, for example, when:
    • 予測精度を、より低い誤警報率(false-alarm rate)またはより高い検出率(hit-rate)の方向へ寄せたい場合。
    • クラスごとに学習サンプル数が大きく異なる場合に、それを補正したい場合。
  • さらに、特定の学習サンプルにアルゴリズムが特別に注目し、それに応じて学習モデルを調整するようにしたい場合は、各学習サンプルに重みを与えることもできる。
  • また、学習データ全体を一度に使うのではなく、その一部のみを使いたい場合もある。たとえば、交差検証(cross-validation)の手順によってパラメータの最適化を行う場合などである。

このように、学習データはかなり複雑な構造を持つことがある。さらに、非常に大きい場合や、すべてが一度には利用できない場合もあるため、この概念を抽象化する必要がある。OpenCV ml にはそのために cv::ml::TrainData クラスがある。

参照
cv::ml::TrainData

正規ベイズ分類器

この単純な分類モデルは、各クラスの特徴ベクトルが正規分布に従う(ただし、必ずしも独立に分布するとは限らない)と仮定する。したがって、データ分布全体の関数はガウス混合分布であり、クラスごとに1つの成分を持つと仮定される。アルゴリズムは学習データを用いて各クラスの平均ベクトルと共分散行列を推定し、それらを予測に用いる。

参照
cv::ml::NormalBayesClassifier

k近傍法

このアルゴリズムはすべての学習サンプルをキャッシュし、新しいサンプルに対しては、そのサンプルの最近傍の一定数(K)を解析して、投票や重み付き和の計算などにより応答を予測する。この手法は、予測時に与えられたベクトルに最も近い既知応答の特徴ベクトルを探すことから、「事例による学習(learning by example)」と呼ばれることもある。

参照
cv::ml::KNearest

サポートベクターマシン

サポートベクターマシン(SVM)は元々、最適な2値(2クラス)分類器を構築する手法であった。後にこの手法は回帰やクラスタリングの問題へと拡張された。SVMはカーネルベース手法の一種である。カーネル関数を用いて特徴ベクトルをより高次元の空間へ写像し、その空間内で最適な線形識別関数、すなわち学習データに最も適合する最適な超平面を構築する。SVMの場合、カーネルは明示的に定義されない。代わりに、超空間内の任意の2点間の距離を定義する必要がある。

この解は最適であり、これは分離超平面と両クラス(2クラス分類器の場合)からの最も近い特徴ベクトルとの間のマージンが最大になることを意味する。超平面に最も近い特徴ベクトルはサポートベクターと呼ばれ、これは他のベクトルの位置が超平面(決定関数)に影響しないことを意味する。

OpenCVのSVM実装は [52] に基づいている。

参照
cv::ml::SVM

SVMによる予測

StatModel::predict(samples, results, flags) を使用する。flags=StatModel::RAW_OUTPUT を渡すと、SVMから生の応答(回帰、1クラスまたは2クラス分類問題の場合)を取得できる。

決定木

本節で取り上げるMLクラスは、[42] で説明されている分類回帰木(Classification and Regression Tree)アルゴリズムを実装している。

cv::ml::DTrees クラスは、単一の決定木または決定木の集合を表す。これは RTrees と Boost の基底クラスでもある。

決定木は二分木(各非葉ノードが2つの子ノードを持つ木)である。分類にも回帰にも使用できる。分類の場合、各木の葉にはクラスラベルが付与され、複数の葉が同じラベルを持つこともある。回帰の場合は、各木の葉にも定数が割り当てられるため、近似関数は区分定数関数となる。

参照
cv::ml::DTrees

決定木による予測

葉ノードに到達し、入力特徴ベクトルに対する応答を得るため、予測手順は根ノードから始まる。各非葉ノードでは、そのノードに格納されたインデックスを持つ特定の変数の値に基づいて、手順は左(次に観測するノードとして左の子ノードを選択)または右へ進む。次のような変数があり得る。

  • 順序付き変数。 変数の値は、これもノードに格納されているしきい値と比較される。値がしきい値より小さければ手順は左へ進み、そうでなければ右へ進む。たとえば、重さが1キログラム未満なら左へ、そうでなければ右へ進む。
  • カテゴリ変数。 離散的な変数の値が、変数が取り得る限られた値の集合の中の特定の部分集合(これもノードに格納されている)に属するかどうかが検査される。属していれば手順は左へ進み、そうでなければ右へ進む。たとえば、色が緑または赤なら左へ、そうでなければ右へ進む。

このように、各ノードでは(variable_index , decision_rule (threshold/subset) )という対が使われる。この対は分割(split)(変数 variable_index による分割)と呼ばれる。葉ノードに到達すると、そのノードに割り当てられた値が予測手順の出力として使われる。

入力ベクトルの特定の特徴が欠落していることがある(たとえば暗闇では物体の色を判定するのが難しい)。この場合、予測手順は特定のノードで行き詰まることがある(前述の例では、ノードが色で分割されている場合)。こうした状況を避けるため、決定木は代理分割(surrogate splits)と呼ばれるものを用いる。すなわち、最良の「主分割(primary split)」に加えて、各木のノードは、ほぼ同じ結果をもたらす1つ以上の別の変数によっても分割され得る。

決定木の学習

木は根ノードから始めて再帰的に構築される。すべての学習データ(特徴ベクトルと応答)が根ノードの分割に使われる。各ノードでは、ある基準に基づいて最適な決定規則(最良の「主分割」)が求められる。機械学習では、分類にはジニ「純度」基準が、回帰には誤差の二乗和が使われる。次に、必要であれば代理分割が求められる。代理分割は、学習データ上での主分割の結果に類似している。すべてのデータは、(予測手順と同様に)主分割と代理分割を用いて左右の子ノードに分けられる。その後、手順は左右両方のノードを再帰的に分割する。各ノードにおいて、再帰手順は次のいずれかの場合に停止する(すなわち、それ以上ノードを分割しない)ことがある。

  • 構築された木の枝の深さが、指定された最大値に達したとき。
  • ノード内の学習サンプル数が指定したしきい値より少なく、それ以上ノードを分割するのが統計的に代表性を持たないとき。
  • ノード内のすべてのサンプルが同じクラスに属するとき、または回帰の場合は変動が小さすぎるとき。
  • 見つかった最良の分割が、ランダムな選択と比べて目立った改善をもたらさないとき。

木の構築後、必要であれば交差検証の手順を用いて枝刈り(プルーニング)を行ってもよい。すなわち、モデルの過学習につながり得る木の一部の枝を切り落とす。通常、この手順は単独の決定木にのみ適用される。一般に、木のアンサンブルは十分に小さい木を構築し、過学習に対して独自の保護機構を用いる。

変数の重要度

決定木の明白な用途である予測に加えて、木はさまざまなデータ分析にも使える。構築された決定木アルゴリズムの重要な性質の1つは、各変数の重要度(相対的な決定力)を計算できることである。たとえば、メッセージ中に出現する単語の集合を特徴ベクトルとして使うスパムフィルタでは、変数の重要度評価を用いて最も「スパムを示唆する」単語を特定でき、辞書のサイズを妥当に保つのに役立つ。

各変数の重要度は、木の中でその変数に対するすべての分割(主分割と代理分割)にわたって計算される。したがって、変数の重要度を正しく計算するには、欠測データがなくても学習パラメータで代理分割を有効にしておく必要がある。

ブースティング

一般的な機械学習のタスクは教師あり学習である。教師あり学習では、入力 \(x\) と出力 \(y\) の間の関数関係 \(F: y = F(x)\) を学習することが目標となる。質的な出力を予測することは分類と呼ばれ、量的な出力を予測することは回帰と呼ばれる。

ブースティングは、教師あり分類学習タスクに対する解を提供する強力な学習概念である。多くの「弱い」分類器の性能を組み合わせて、強力な委員会を構成する [279]。弱い分類器に求められるのは偶然より良いことだけであり、したがって非常に単純で計算コストも低くてよい。しかし、それらの多くを巧妙に組み合わせると、SVMやニューラルネットワークなどのほとんどの「一枚岩の」強い分類器をしばしば上回る、強力な分類器が得られる。

決定木は、ブースティング方式で使われる最も一般的な弱い分類器である。多くの場合、木あたり1つの分割ノードしか持たない最も単純な決定木(切り株、stumpsと呼ばれる)で十分である。

ブーストされたモデルは、\(x_i \in{R^K}\) かつ \(y_i \in{-1, +1}\) である \(N\) 個の学習例 \({(x_i,y_i)}1N\) に基づく。\(x_i\) は \(K\) 成分のベクトルである。各成分は、対象の学習タスクに関連する特徴を符号化する。所望の2クラス出力は -1 と +1 として符号化される。

ブースティングのさまざまな変種は、Discrete Adaboost、Real AdaBoost、LogitBoost、Gentle AdaBoost として知られている [99]。これらはすべて全体構造が非常に似ている。したがって、本章では以下に概説する標準的な2クラスの Discrete AdaBoost アルゴリズムのみに焦点を当てる。最初に各サンプルに同じ重みが割り当てられる(ステップ2)。次に、重み付き学習データ上で弱い分類器 \(f_{m(x)}\) が学習される(ステップ3a)。その重み付き学習誤差とスケーリング係数 \(c_m\) が計算される(ステップ3b)。誤分類された学習サンプルの重みが増やされる(ステップ3c)。その後すべての重みが正規化され、次の弱い分類器を見つける処理がさらに \(M\) -1 回続けられる。最終的な分類器 \(F(x)\) は、個々の弱い分類器にわたる重み付き和の符号である(ステップ4)。

2クラス Discrete AdaBoost アルゴリズム

  • \(x_i \in{R^K}, y_i \in{-1, +1}\) である \(N\) 個の例 \({(x_i,y_i)}1N\) を設定する。
  • 重みを \(w_i = 1/N, i = 1,...,N\) として割り当てる。
  • Repeat for \(m = 1,2,...,M\) :
    • 学習データ上で重み \(w_i\) を用いて、分類器 \(f_m(x) \in{-1,1}\) を当てはめる。
    • \(err_m = E_w [1_{(y \neq f_m(x))}], c_m = log((1 - err_m)/err_m)\) を計算する。
    • \(w_i \Leftarrow w_i exp[c_m 1_{(y_i \neq f_m(x_i))}], i = 1,2,...,N,\) と設定し、\(\Sigma i w_i = 1\) となるように再正規化する。
  • 次の式を用いて新しいサンプル x を分類する: \(\textrm{sign} (\Sigma m = 1M c_m f_m(x))\)。
覚え書き
古典的なブースティング手法と同様に、現在の実装は2クラス分類器のみをサポートする。M > 2 クラスの場合は、問題を2クラス問題に帰着させる AdaBoost.MH アルゴリズム([99] で説明)があるが、これははるかに大きな学習集合を必要とする。

ブーストされたモデルの計算時間を、精度を大幅に損なうことなく削減するため、影響トリミング(influence trimming)技法を利用できる。学習アルゴリズムが進行しアンサンブル内の木の数が増えるにつれて、より多くの学習サンプルが正しく、かつより高い確信度で分類されるようになり、その結果これらのサンプルは後続の反復でより小さい重みを受け取る。相対的な重みが非常に小さい例は、弱い分類器の学習にほとんど影響しない。したがって、そのような例は、得られる分類器にあまり影響を与えることなく、弱い分類器の学習中に除外できる。この処理は weight_trim_rate パラメータで制御される。重み総量のうち合計割合が weight_trim_rate となる例のみが弱い分類器の学習に使われる。なお、すべての学習例の重みは各学習反復で再計算される。特定の反復で削除された例が、後段の一部の弱い分類器の学習に再び使われることもある [99]

参照
cv::ml::Boost

Boostによる予測

StatModel::predict(samples, results, flags) を使用する。flags=StatModel::RAW_OUTPUT を渡すと、Boost分類器から生の和を取得できる。

ランダムツリー

ランダムツリーは Leo Breiman と Adele Cutler によって導入された: http://www.stat.berkeley.edu/users/breiman/RandomForests/。このアルゴリズムは分類問題と回帰問題の両方を扱える。ランダムツリーは木予測器の集合(アンサンブル)であり、本節では以降これをフォレスト(forest)と呼ぶ(この用語も L. Breiman によって導入された)。分類は次のように行われる。ランダムツリー分類器は入力特徴ベクトルを受け取り、フォレスト内のすべての木でそれを分類し、最多の「票」を得たクラスラベルを出力する。回帰の場合、分類器の応答はフォレスト内のすべての木の応答の平均である。

すべての木は同じパラメータで、ただし異なる学習集合上で学習される。これらの集合は、ブートストラップ手順を用いて元の学習集合から生成される。すなわち、各学習集合について、元の集合と同じ数のベクトル( =N )をランダムに選択する。ベクトルは復元抽出で選ばれる。つまり、あるベクトルは複数回出現し、あるベクトルは含まれないこともある。学習された各木の各ノードでは、最良の分割を見つけるためにすべての変数が使われるのではなく、それらのランダムな部分集合が使われる。各ノードで新しい部分集合が生成される。ただし、そのサイズはすべてのノードおよびすべての木で固定である。これは学習パラメータであり、デフォルトでは \(\sqrt{number\_of\_variables}\) に設定される。構築された木はいずれも枝刈りされない。

ランダムツリーでは、交差検証やブートストラップといった精度推定の手順、あるいは学習誤差の推定を得るための別個のテスト集合は必要ない。誤差は学習中に内部的に推定される。現在の木の学習集合を復元抽出によって取り出すと、一部のベクトルは除外される(いわゆるoob(out-of-bag、バッグ外)データ)。oobデータのサイズはおよそ N/3 である。分類誤差は、このoobデータを用いて次のように推定される。

  • i番目の木に対して oob である各ベクトルについて、まさにそのi番目の木を用いて予測を得る。
  • すべての木が学習された後、これまでに一度でも oob となった各ベクトルについて、その勝者クラス(そのベクトルが oob であった木の中で最多の票を得たクラス)を求め、それを正解応答と比較する。
  • 分類誤差の推定値を、誤分類された oob ベクトルの数を元データ内の全ベクトルに対する比として計算する。回帰の場合、oob誤差は oob ベクトルの差の二乗誤差を全ベクトル数で割って計算される。

ランダムツリーの使用例については、OpenCVディストリビューションのletter_recog.cppサンプルを参照のこと。

参照
cv::ml::RTrees

参考文献:

期待値最大化法 (Expectation Maximization)

期待値最大化法 (Expectation Maximization, EM) アルゴリズムは、指定した混合数のガウス混合分布の形で表される多変量確率密度関数の引数を推定する。

d次元ユークリッド空間からガウス混合分布に従って抽出された、N個の特徴ベクトルの集合 { \(x_1, x_2,...,x_{N}\) } を考える:

\[p(x;a_k,S_k, \pi _k) = \sum _{k=1}^{m} \pi _kp_k(x), \quad \pi _k \geq 0, \quad \sum _{k=1}^{m} \pi _k=1,\]

\[p_k(x)= \varphi (x;a_k,S_k)= \frac{1}{(2\pi)^{d/2}\mid{S_k}\mid^{1/2}} exp \left \{ - \frac{1}{2} (x-a_k)^TS_k^{-1}(x-a_k) \right \} ,\]

ここで \(m\) は混合数、\(p_k\) は平均 \(a_k\) と共分散行列 \(S_k\) を持つ正規分布の密度、\(\pi_k\) はk番目の混合の重みである。混合数 \(M\) とサンプル \(x_i\), \(i=1..N\) が与えられると、アルゴリズムはすべての混合引数、すなわち \(a_k\), \(S_k\), \(\pi_k\) の最尤推定値 (MLE) を求める:

\[L(x, \theta )=logp(x, \theta )= \sum _{i=1}^{N}log \left ( \sum _{k=1}^{m} \pi _kp_k(x) \right ) \to \max _{ \theta \in \Theta },\]

\[\Theta = \left \{ (a_k,S_k, \pi _k): a_k \in \mathbbm{R} ^d,S_k=S_k^T>0,S_k \in \mathbbm{R} ^{d \times d}, \pi _k \geq 0, \sum _{k=1}^{m} \pi _k=1 \right \} .\]

EMアルゴリズムは反復的な手続きである。各反復は2つのステップから成る。第1ステップ(期待値ステップ、すなわちEステップ)では、現在利用可能な混合引数の推定値を使って、サンプルiが混合kに属する確率 \(p_{i,k}\)(以下の式では \(\alpha_{i,k}\) と表記)を求める:

\[\alpha _{ki} = \frac{\pi_k\varphi(x;a_k,S_k)}{\sum\limits_{j=1}^{m}\pi_j\varphi(x;a_j,S_j)} .\]

第2ステップ(最大化ステップ、すなわちMステップ)では、計算した確率を使って混合引数の推定値を精緻化する:

\[\pi _k= \frac{1}{N} \sum _{i=1}^{N} \alpha _{ki}, \quad a_k= \frac{\sum\limits_{i=1}^{N}\alpha_{ki}x_i}{\sum\limits_{i=1}^{N}\alpha_{ki}} , \quad S_k= \frac{\sum\limits_{i=1}^{N}\alpha_{ki}(x_i-a_k)(x_i-a_k)^T}{\sum\limits_{i=1}^{N}\alpha_{ki}}\]

あるいは、\(p_{i,k}\) の初期値が与えられる場合は、アルゴリズムをMステップから開始してもよい。\(p_{i,k}\) が未知のもう1つの代替策は、より単純なクラスタリングアルゴリズムを使って入力サンプルを事前クラスタリングし、初期の \(p_{i,k}\) を得ることである。多くの場合(機械学習を含む)、この目的にはk-meansアルゴリズムが使われる。

EMアルゴリズムの主な問題の1つは、推定すべき引数の数が多いことである。引数の大部分は共分散行列にあり、それぞれが \(d \times d\) 個の要素を持つ(\(d\) は特徴空間の次元数)。しかし、多くの実用的な問題では、共分散行列は対角行列、あるいは \(\mu_k*I\) にすら近い(ここで \(I\) は単位行列、\(\mu_k\) は混合に依存する「スケール」引数である)。そのため、頑健な計算手法では、共分散行列に対してより厳しい制約を課して開始し、得られた推定引数を制約の少ない最適化問題の入力として使うことができる(多くの場合、対角共分散行列ですでに十分に良い近似となる)。

参照
cv::ml::EM

参考文献:

  • 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.

ニューラルネットワーク

MLは順伝播型人工ニューラルネットワーク、より具体的には、最も一般的に使われるタイプのニューラルネットワークである多層パーセプトロン (MLP) を実装している。MLPは入力層、出力層、および1つ以上の隠れ層から成る。MLPの各層には、前後の層のニューロンと方向性をもって接続された1つ以上のニューロンが含まれる。以下の例は、3つの入力、2つの出力、および5つのニューロンを含む隠れ層を持つ3層パーセプトロンを表す:

image

MLP内のすべてのニューロンは同様である。各ニューロンは複数の入力リンク(前の層の複数のニューロンの出力値を入力として受け取る)と複数の出力リンク(次の層の複数のニューロンに応答を渡す)を持つ。前の層から取得した値は、ニューロンごとに固有の重みとバイアス項を加えて合計される。この合計は活性化関数 \(f\) を使って変換されるが、この関数もニューロンごとに異なる場合がある。

image

言い換えると、層 \(n\) の出力 \(x_j\) が与えられると、層 \(n+1\) の出力 \(y_i\) は次のように計算される:

\[u_i = \sum _j (w^{n+1}_{i,j}*x_j) + w^{n+1}_{i,bias}\]

\[y_i = f(u_i)\]

さまざまな活性化関数を使うことができる。MLは3つの標準的な関数を実装している:

  • 恒等関数 ( cv::ml::ANN_MLP::IDENTITY ): \(f(x)=x\)
  • 対称シグモイド ( cv::ml::ANN_MLP::SIGMOID_SYM ): \(f(x)=\beta*(1-e^{-\alpha x})/(1+e^{-\alpha x}\) )。これはMLPのデフォルトの選択肢である。\(\beta =1, \alpha =1\) の標準シグモイドを以下に示す:
image
  • ガウス関数 ( cv::ml::ANN_MLP::GAUSSIAN ): \(f(x)=\beta e^{-\alpha x*x}\) 。これは現時点では完全にはサポートされていない。

MLでは、すべてのニューロンが同じ活性化関数を持ち、同じ自由引数 ( \(\alpha, \beta\) ) を持つ。これらはユーザが指定し、学習アルゴリズムによって変更されることはない。

したがって、学習済みネットワーク全体は次のように動作する:

  1. 特徴ベクトルを入力として受け取る。ベクトルのサイズは入力層のサイズに等しい。
  2. 値を最初の隠れ層への入力として渡す。
  3. 重みと活性化関数を使って隠れ層の出力を計算する。
  4. 出力層を計算するまで、出力を下流へと渡していく。

したがって、ネットワークを計算するには、すべての重み \(w^{n+1)}_{i,j}\) を知る必要がある。重みは学習アルゴリズムによって計算される。アルゴリズムは、対応する出力ベクトルを伴う複数の入力ベクトルから成る学習セットを受け取り、ネットワークが与えられた入力ベクトルに対して望ましい応答を返せるように、重みを反復的に調整する。

ネットワークのサイズ(隠れ層の数とそのサイズ)が大きいほど、ネットワークの潜在的な柔軟性は高まる。学習セットでの誤差は任意に小さくできる。しかし同時に、学習済みネットワークは学習セットに含まれるノイズも「学習」してしまうため、ネットワークサイズがある限界に達すると、通常テストセットでの誤差は増加し始める。さらに、大きなネットワークは小さなネットワークよりはるかに長い学習時間を要するため、cv::PCA などの手法を使ってデータを前処理し、本質的な特徴のみで小さなネットワークを学習させるのが妥当である。

MLPのもう1つの特徴は、カテゴリデータをそのままでは扱えないことである。ただし、回避策がある。入力層または出力層(\(n>2\) のn クラス分類器の場合)のある特徴がカテゴリ変数であり、\(M>2\) 個の異なる値を取りうる場合、それをM個の要素から成る2値タプルとして表現するのが理にかなっている。このタプルでは、特徴がM個の可能な値のうちi 番目の値に等しい場合に限り、i 番目の要素が1となる。これにより入力層/出力層のサイズは増えるが、学習アルゴリズムの収束は速まり、同時にこうした変数の「ファジー」な値、すなわち固定値の代わりに確率のタプルを扱えるようになる。

MLはMLPの学習に2つのアルゴリズムを実装している。1つ目のアルゴリズムは古典的なランダム逐次バックプロパゲーションアルゴリズムである。2つ目(デフォルト)はバッチRPROPアルゴリズムである。

参照
cv::ml::ANN_MLP

ロジスティック回帰

MLは確率的な分類手法であるロジスティック回帰を実装している。ロジスティック回帰は2値分類アルゴリズムであり、サポートベクターマシン (SVM) と密接に関連している。SVMと同様に、ロジスティック回帰は数字認識(与えられた画像から0, 1, 2, 3,... のような数字を認識する)のような多クラス分類問題にも拡張できる。このバージョンのロジスティック回帰は2値分類と多クラス分類の両方をサポートする(多クラスの場合は複数の2クラス分類器を作成する)。ロジスティック回帰分類器を学習させるには、バッチ勾配降下法 (Batch Gradient Descent) およびミニバッチ勾配降下法 (Mini-Batch Gradient Descent) アルゴリズムが使われる(http://en.wikipedia.org/wiki/Gradient_descent_optimization を参照)。ロジスティック回帰は識別的分類器である(詳細は http://www.cs.cmu.edu/~tom/NewChapters.html を参照)。ロジスティック回帰はLogisticRegressionとしてC++クラスで実装されている。

ロジスティック回帰では、仮説 \(0 \leq h_\theta(x) \leq 1\) が達成されるように、学習引数 \(\theta\) を最適化しようとする。\(h_\theta(x) = g(h_\theta(x))\) であり、ロジスティック関数(シグモイド関数)として \(g(z) = \frac{1}{1+e^{-z}}\) を用いる。ロジスティック回帰における「ロジスティック」という用語はこの関数を指す。クラス0とクラス1の2値分類問題のデータが与えられたとき、\(h_\theta(x) \geq 0.5\) であればそのデータインスタンスはクラス1に属し、\(h_\theta(x) < 0.5\) であればクラス0に属すると判定できる。

ロジスティック回帰では、学習誤差を減らし、高い学習精度を確保するために、適切な引数を選ぶことが極めて重要である:

  • 学習率は setLearningRate メソッドで設定できる。これは解にどれだけ速く近づくかを決定する。正の実数である。
  • LogisticRegressionでは、バッチ勾配降下法やミニバッチ勾配降下法のような最適化アルゴリズムがサポートされている。これらの最適化アルゴリズムが実行すべき反復回数を指定することが重要である。反復回数は setIterations で設定できる。この引数は踏み出すステップの数と考えることができ、学習率はそれが大きなステップか小さなステップかを指定する。この引数と前述の引数によって、解にどれだけ速く到達するかが決まる。
  • 過学習を補正するために正則化が行われ、これは setRegularization で有効化できる。このメソッドに regularization kinds のいずれかを渡すことで、どの種類の正則化を行うかを指定できる。
  • ロジスティック回帰の実装は、バッチ勾配降下法またはミニバッチ勾配降下法による2つの学習方法の選択肢を提供する。これを指定するには、setTrainMethodLogisticRegression::BATCH または LogisticRegression::MINI_BATCH のいずれかとともに呼び出す。学習方法が MINI_BATCH に設定されている場合、ミニバッチのサイズを setMiniBatchSize で正の整数に設定する必要がある。

ロジスティック回帰分類器の学習引数のサンプルセットは、次のように初期化できる:

Ptr<LogisticRegression> lr1 = LogisticRegression::create();
lr1->setLearningRate(0.001);
lr1->setIterations(10);
lr1->setRegularization(LogisticRegression::REG_L2);
lr1->setTrainMethod(LogisticRegression::BATCH);
lr1->setMiniBatchSize(1);
参照
cv::ml::LogisticRegression