【AIプログラミング】パーセプトロンで分類問題、ディープラーニングの基礎的な技術

AIプログラミング

最初、ディープラーニングとか、そういうものをやりたかったんだ。

最初からやればよかったかもね。

ニューラルネットワークや、ディープラーニングは、私が機械学習を勉強するうえで一番勉強したかった内容ですが、いろいろ知識ないと理解できないと思い勉強を後回しにしていました。今考えると、アルゴリズム毎にドラえもんのように1話完結で勉強できているので、順番はそんなに関係なかったように感じます・・・

まずは、基本的な「パーセプトロン」というものを勉強しました。

こんな人の役に立つかも

・機械学習プログラミングを勉強している人

・パーセプトロンについて知りたい人

・パーセプトロン、多層パーセプトロン、ニューラルネットワークの違いが知りたい人

スポンサーリンク

パーセプトロンからディープラーニングへ

私が勉強したいディープラーニングへ至るには、次のような流れで勉強するのが良さそうです。

1.パーセプトロン
※scikit-learnに実装されています。

 ↓

2.多層パーセプトロン(ニューラルネットワーク)
※scikit-learnに実装されています。

 ↓

3.ディープラーニング(ニューラルネットワーク)
※scikit-learn以外のライブラリで詳細に作りこむことができそうです。

ニューラルネットワークの中にも、いろいろ細かく手法があるみたいで、どんなものがあるのか楽しみです。いろいろな手法は、扱う問題によって使い分けたりするみたいです。

また、scikit-learnでは多層パーセプトロンが実装されていて、かなりいろいろできそうな雰囲気があります。

パーセプトロンの概要

パーセプトロンは、入力値を与えると、「0」か「1」を返してくれるものです。

・入力は「値1」「値2」・・・・のようにたくさん与えることができます。

・出力は「活性化関数」というものを通ります。

・パーセプトロンの活性化関数は「ステップ関数」と呼ばれるものを利用し、出力は「0」または「1」となります。

パーセプトロンが2クラス分類をするときのイメージです。

このパーセプトロンが発展してディープラーニングになっていくのか

パーセプトロンと多層パーセプトロンとの違い

パーセプトロンと多層パーセプトロンの違いは、名前の通り、多層かどうかという点になります。パーセプトロンには、入力と出力(それぞれ入力層、出力層と呼ばれる)しか存在していませんので、基本的に線形分離可能なものにしか対応できません。

多層パーセプトロンになると、入力層と出力層の間に中間層というものが入るので、より複雑な分類問題などに取り組むことができるとのことです。

多層パーセプトロンはニューラルネットワークの仲間のような存在らしいです。

ディープラーニングにまた一歩

パーセプトロンをscikit-learnで試してみよう

まず、パーセプトロンを試すためのデータを準備します。一番単純に2クラス分類を行いたいので、scikit-learnの「make_blobs」という関数で出たを作成してみます。

このmake_blobsは簡単にクラスターに分かれたデータを準備することができるのでとても面白いです。

from sklearn.datasets import make_blobs

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=3)

plt.scatter(X[:, 0], X[:, 1], c=y)

このような分布のデータができました。

make_blobsで作成したデータを、パーセプトロンで訓練してみます。

from sklearn.linear_model import Perceptron

clf = Perceptron().fit(X,y)

境界線も可視化したいので、このような関数を準備します。

境界線の可視化については、こちらの記事もご参考ください。

#3つの関数を作成
def make_meshgrid(x, y, h=.02):
    x_min, x_max = x.min() - 1, x.max() + 1
    y_min, y_max = y.min() - 1, y.max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    return xx, yy

def plot_contours(ax, clf, xx, yy, **params):
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    out = ax.contourf(xx, yy, Z, **params)
    return out

#ここはオリジナルの関数です。
def graf_setting(ax):
    ax.set_xticks(())
    ax.set_yticks(())

境界線を可視化して分類の様子を確認します。

#空のグラフを作成
fig = plt.figure(figsize=(9, 4))
ax = fig.add_subplot(121)

#グリッドのデータを作成
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)

#グラフに境界線とデータをプロット
plot_contours(ax, clf, xx, yy, cmap=plt.cm.coolwarm, alpha=0.8)
ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
graf_setting(ax)

このような線形分離可能なデータだとパーセプトロンはうまくいきますが、データが重なっていたりする線形分離不可能なデータについてはうまくいかないそうです。

タイトルとURLをコピーしました