二項分類 (パーセプトロン,符号関数を使用)



機械学習

分類(classification)

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

クラスタリング

強化学習

敵対的生成ネットワーク

公開日:2019/11/3          

前提知識
 ・パーセプトロン
 ・勾配法(最急降下法)
 ・ステップ , 符号関数
 ・python関数


分類問題(Classification problem)とは、データをカテゴリ別に分類するためにはどうしたら良いかを考える問題で、その中でもデータを二つのカテゴリに分類する手法を二項分類(または二値分類)といいます。 ここではパーセプトロン勾配法を用いた二項分類の方法を実例で説明します。以下のようなデータを線形分離します。データの意味付けは何でも良いですが、 例えばある昆虫の、x軸に身長、y軸に体重とした時にその個体がオスかメスかを分類します。



■パーセプトロン
オスとメスを分類する直線を求める事は、以下1次式の係数aとbを求める事になります。


係数a,bを求める為にパーセプトロンを用います。パーセプトロンは以下式で表され、ある変数を入力したら活性化関数を介してある値が出力されます。 今回は活性化関数に符号関数を用いています。(活性化関数は符号関数の他にもシグモイドなどあり、状況によって適切な関数を選択する)




パーセプトロンを今回の事例に当てはめると以下になります。オスとメスを切り分ける直線を(2)式とおき、(2)式の値が0より大きいか小さいかでオスかメスかを切り分けます。 つまり、オスのデータを入れたら必ず0より小さくなる、メスのデータを入れたら必ず0より大きくなるwを設定することができたら、分類は成功したといえます。



最終的に(1)式のaとbを求めたいので、以下の様に変形します。



■係数(重み)wの最適化方法
直線uを活性化関数に入れて1と-1を出力させる理由は、重みwの最適化のために必要となります。 その方法は、実際のデータを用いてuが狙いの値になる様に重みを更新させていくのですが、実データに1と-1のラベル(tとおく)を設けておき、 計算結果の答えが正しかったかどうか比較するために使用します。



重みを更新する具体的な方法は勾配法を用います。勾配法とは、関数(今回は誤差関数)の最小値を逐次計算的に求める手法で以下式で表します。


上記を今回の事例に当てはめます。先ず誤差が発生している状態は以下となっています。



ここで反映率は1としています。勾配法では一般的に学習率は小さくするのですが、1重のパーセプトロンにおいてデータが完全に線形分離可能であれば、 アルゴリズムは有限回で収束する(これをパーセプトロンの収束定理という)ことが解っている為、反映率にこだわる必要が無いからです。

■pythonによる実装
実際にpythonでプログラムを作り動作を確認します。対象はこれまで例にあげた昆虫のオスとメスの分類とします。環境及びプログラムファイル等は以下。

 ・pythonバージョン:Ver3.6で確認
 ・必要ライブラリ:numpy,matplotlib (インストール方法はこちら)
 ・必要ファイルperceptron.zip(プログラムファイル, 分類対象データ)

プログラム説明 使用するpythonの関数はこちらで説明しております。
プログラム自体は簡単なので上から読んでいけば解ると思いますが、ポイントを説明します。

<重みの初期値>
重みwの初期値は、線形分離可能な場合においては基本的には何でも良いです。非線形の問題を扱う様になってくると、 標準偏差の分布に従ったランダムの値を設定したりしますが、今回は単純なランダム値を設定します。

w = np.random.rand(3) #(2)式で定義されるw(左からw0,w1,w2)を設定


<重みの更新>
重みを更新する条件は、計算結果が間違っている場合(t*(w0+w1x1+w2x2)<0)ですが、その判定部が以下。

if np.dot(w, np.array([1, x1, x2])) * t_n < 0:

重み更新部分は以下で、(4)式に相当。w0にかける項をバイアス項といい、ここでは1がバイアス項となります。

w += t_n * np.array([1, x1, x2])


プログラム実行結果
結果は以下のとおり、きちんと分類できた線を引くことができました。


プログラム実行結果からの考察
① 今回のデータでは学習回数が3ループ目で終了しますが、オフセットbの更新が必要な場合は大幅に学習回数を増やす必要があります。 試しにデータの(x:301 , y:135)のyを147に変えてみると、16万ループ位必要になります。

② 線形分離できないデータを対象にする場合当然ながら収束することは有りません。仮にループ数を増やしても、よりもっともらしい境界線が引けるわけではなく、 逆に不正解が多くなってしまう場合があります。これは符号関数を用いていることが要因で、不正解の場合に重みを正解方向に全振りで寄せてしまう為です。



③ 更に符号関数を用いた二値分類の場合、不正解が出なくなった時点で計算を終了するので最適な分類になるとは限らず、本来ははよりもっともらしい線を引けるはずです。




これら問題を解消するための一つの有効な手法にロジスティック回帰があります。









サブチャンネルあります。⇒ 何かのお役に立てればと

関連記事一覧



機械学習

分類(classification)

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

クラスタリング

強化学習

敵対的生成ネットワーク