|
前提知識
・パーセプトロン
・勾配法(最急降下法)
・符号関数による分類
・シグモイド関数
・python関数
ロジスティック回帰とは二項分類の方法の一つです。こちらでパーセプトロンと符号関数を用いた二項分類の方法について説明しましたが、その方法は分類結果が最適な結果とは限らなかったり、
線形分離できないデータを扱った場合に、解が収束せず線形分離とは程遠い結果になる場合があります。それら問題を解消し、よりもっともらしく分類できる方法がロジスティック回帰です。
今回の題材も符号関数による二項分類の時と同じく以下のようなデータを分離します。

■考え方
符号関数による二項分類の方法に対し、ロジスティック回帰はパーセプトロンを用いる所は同じですが、違いは活性化関数にシグモイド関数(ここではロジスティック関数ともいう)を用いるところです。
こうする事で分類が正しい確率が0か1かという2値でしかなかったのが、その中間の確率で考える事ができるので精度良く求める事ができます。(例えば、AかBかではなく、Aの確率80%、Bの確率20%など)

■重みwの決定方法
重みwの決定方法は符号関数を用いた二項分類と同様、勾配法を用います。勾配法とは、関数(今回は誤差関数)の最小値を逐次計算的に求める手法で以下式で表します。

ここで誤差Eは以下となります。

これを(1)式に代入し、wで偏微分した結果は以下になります。(詳細はこちらで説明)

■pythonによる実装
実際にpythonでプログラムを作り動作を確認します。対象はこれまで例にあげた昆虫のオスとメスの分類とします。環境及びプログラムファイル等は以下。
・pythonバージョン:Ver3.6で確認
・必要ライブラリ:numpy,matplotlib (インストール方法はこちら)
・必要ファイル:logistic.zip(プログラムファイル, 分類対象データ)
プログラム説明 使用するpythonの関数はこちらで説明しております。
詳細はプログラムソースを見て欲しいのですが、ポイントは以下。
データを標準正規化する
シグモイド関数にある指数関数に入れる値は、出力値がすぐ飽和するのを防ぐため標準正規化する必要があります。その処置は以下。
stdized_x = (x - x.mean(axis=0)) / x.std(axis=0) #標準正規化
重みを更新する
重みを更新する部分は上記(2)式のとおりです。
sig = 1/(1 + np.exp(-np.dot(matrix_x, w))) # シグモイド関数
w += rate * np.dot((t-sig) * sig * (1-sig) , matrix_x) # 重み更新
プログラム実行結果
以下のとおり、きちんと分類することができました。

考察
① 分離可能な線を求める事ができたとしても、そこで演算終了する訳ではなくより最適な直線を求めて探索します。ループ数が大きい方が最適解を求めやすくなります。
② 線形分離不可能なデータであったとしても、線形分離できないながらも、もっともらしい線を引くことができます。符号関数を用いた場合には収束しませんでした。

次に、線形分離不可能なデータに対して多項式で分離(非線形分離)する方法をこちらで説明します。
サブチャンネルあります。⇒ 何かのお役に立てればと
|
|