少し間が空いてしまいましたが,
環境はこれまでと同じくPython/
パーセプトロンの復習
第15回で紹介したパーセプトロンの学習アルゴリズムをもう一度簡単に振り返っておきましょう。
2次元平面上のデータ点(xn,yn)(n=1,…,N)に正解ラベルtn∈{+1,-1}が与えられているとします。パーセプトロンは,
そのようなパラメータは,
データの中からランダムに1点(xn,yn)を取り出し,
続いてまた別のデータ点をランダムに取って,
すべてのデータ点について
ここまで,
D次元空間の点xnに対して,
これらを使って,
パラメータベクトルwの次元は,
パーセプトロンの実装
それではパーセプトロンを実装していきますが,
一般にプログラムを書くとき,
ところがこういったアルゴリズムのとき,
しかし慣れてないとそのあたりがわかりませんから,
そこで今回はまず中核となるところを実装して,
さて,
ここでは簡単のためデータ点が2次元空間上にある場合を実装するのですが,
というわけで,
import numpy as np
# データ点を特徴ベクトルに変換
def phi(x, y):
return np.array([x, y, 1])
φの引数のデータ点をベクトルで与える場合は,
# 末尾に定数項にあたる 1 を付け加えるバージョン
# (今回はこちらは使いません)
def phi(x):
return np.concatenate((x, [1]))
次は予測とパラメータの更新を書きます。数式を素直に実装するとこうなります。
# 予測
predict = np.sign((w * phi(x_n, y_n)).sum())
# 予測が不正解なら,パラメータを更新する
if predict != t_n:
w += t_n * phi(x_n, y_n)
こうしてみると,
その中で一番簡単なのはwですから,
w = np.zeros(3) # 3次の 0 ベクトル
データは2次元空間ですが,
次にデータ点(xn,yn)や正解tnですが,
いえ,
Pythonで0からN-1までの配列を作るにはrange関数を,
import random
w = np.zeros(3) # 3次の 0 ベクトル
list = range(N)
random.shuffle(list)
for n in list:
x_n = X[n]
y_n = Y[n]
t_n = T[n]
# 予測
predict = np.sign((w * phi(x_n, y_n)).sum())
# 予測が不正解なら,パラメータを更新する
if predict != t_n:
w += t_n * phi(x_n, y_n)
さらに
while True:
list = range(N)
random.shuffle(list)
misses = 0 # 予測を外した回数
for n in list:
x_n, y_n = X[n, :]
t_n = T[n]
# 予測
predict = np.sign((w * phi(x_n, y_n)).sum())
# 予測が不正解なら,パラメータを更新する
if predict != t_n:
w += t_n * phi(x_n, y_n)
misses += 1
# 予測が外れる点が無くなったら学習終了(ループを抜ける)
if misses == 0:
break