python機械学習プログラミング(25ページ)
読み進めていくと結局このプログラムを理解しきれていないという事が問題で、後々で必ずここに戻ってくる。
そもそも、数式もわからないプログラムもわからないところから始めているのでつまずくのは当たり前なので地道にコツコツ頑張っていきます!!
では、プログラムの理解から始めますが、僕がつまずいているのはこの箇所!
self.w_[1:] += update * xi
25ページのプログラムの後半に出てくる箇所ですね。
【この部分についての自分なりの理解!!】
結論から言いますと21ページにある
式(2.1.5)をプログラムにするとこうなるのかな??という理解をしました。
さて、なぜそうなるのか?というところですが、自分なりの理解を載せていきます。
self.w_[1:] += update * xi
を理解するためにプログラムの前後を見ていきます。
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
updateは
update = self.eta * (target - self.predict(xi))
となっています。山ほどわからないところがあるのでひとつづつ見ていきます。
update = self.eta * (target - self.predict(xi))
self.etaは最初の方に宣言されています。
def __init__(self, eta=0.01, n_iter=10):
self.eta = eta
self.n_iter = n_iter
なので、etaは0.01という事ですね。
targetは少し上の方にあります
for _ in range(self.n_iter):
errors = 0
for xi, target in zip(X, y):
update = self.eta * (target - self.predict(xi))
という事ですね。
あとはself.predict(xi)についてです。
これは下の方に
def net_input(self, X):
return np.dot(X, self.w_[1:]) + self.w_[0]def predict(self, X):
return np.where(self.net_input(X) >= 0.0, 1, -1)
という事で
self.predict(xi)は関数?メソッド?として宣言してあるので
np.where(self.net_input(X)>=0.0,1,-1)
となります。さらにself.net_input(X)はすぐ上にあるので、
np.dot(X,self.w_[1:])+self.w_[0]
となります。さてもう一度
self.w_[1:] += update * xi
を見ていきます。updateを分解します。
self.w_[1:] += self.eta * (target - self.predict(xi))*xi
次にself.predict(xi)を分解します。
self.w_[1:] += self.eta * (target - (np.where(self.net_input(X)>=0.0,1,-1)))*xi
さらにself.net_input(X)も分解します。
self.w_[1:] += self.eta * (target - (np.where((np.dot(X,self.w_[1:])+self.w_[0])>=0.0,1,-1)))*xi
さて、ここで21ページに戻ってみてみます。
式(2.1.5)です。
僕なりの理解ではこの式をプログラムするとこうなるのだろうと思います。