Numpyでパーセプトロン


前置き

みなさん、Python をなんとなく触っていませんか? 僕はとりあえずネットに載っているコードを買いとけば動くからいいや、としていたのでこれを機にしっかり学びます。今回は__init__()編です。


パーセプトロンクラス

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import numpy as np

class Perceptron(object):
"""パーセプトロンの分類器

eta : 学習率(0.0より大きく1.0以下)
n_iter : 訓練データの訓練回数
random_state : 重みを初期化するための乱数シード
w_ : 適用後の重み
errors_ : 各エポックでの誤分類(更新)の数
"""
def __init__(self, eta=0.01, n_iter=50, random_state=1):
self.eta = eta
self.n_iter = n_iter
self.random_state = random_state

def fit(self, X, y):
"""
X : 訓練データ, shape = [n_examples, n_features]
n_exampleは訓練データの個数、n_featuresは特徴量の個数
y : 目的変数
self : object
"""
rgen = np.random.RandomState(self.random_state)
self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1]) # w_を特徴量の数 + 1(バイアス)に初期化
self.errors_ = []

for _ in range(self.n_iter):
errors = 0
for xi, target in zip(X, y):
update = self.eta * (target - self.predict(xi))
self.w_[1:] += update * xi
self.w_[0] += update
errors += int(update != 0.0)
self.errors_.append(errors)
return self

def net_input(self, X):
return np.dot(X, self.w_[1:]) + self.w_[0] #w_0x_0+w_1x_1+...を計算

def predict(self, X):
return np.where(self.net_input(X) >= 0.0, 1, -1) #self.net_input(X) >= 0.0なら1,それ以外なら-1を出力

良くわからなかった点