回答編集履歴

6

修正

2020/06/11 09:05

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -94,11 +94,11 @@
94
94
 
95
95
 
96
96
 
97
- 正解が0なのに予測が1と誤識別したら
97
+ 正解が-1なのに予測が1と誤識別したら
98
98
 
99
99
  → self.w_[1:] = self.w_[1:] - self.eta * 2 * xi と更新
100
100
 
101
- 正解が1なのに予測が0と誤識別したら
101
+ 正解が1なのに予測が-1と誤識別したら
102
102
 
103
103
  → self.w_[1:] = self.w_[1:] + self.eta * 2 * xi
104
104
 

5

修正

2020/06/11 09:05

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -80,11 +80,11 @@
80
80
 
81
81
 
82
82
 
83
- ここで、self.eta * (target - self.predict(xi)) について考えると、ラベルが0, 1 の2クラスなら
83
+ ここで、self.eta * (target - self.predict(xi)) について考えると、ラベルが-1, 1 の2クラスなら
84
84
 
85
- target = 0, self.predict(xi) = 1 なら self.eta * (0 - 1) = -self.eta
85
+ target = -1, self.predict(xi) = 1 なら self.eta * (-1 - 1) = -2 self.eta
86
86
 
87
- target = 1, self.predict(xi) = 0 なら self.eta * (1 - 0) = self.eta
87
+ target = 1, self.predict(xi) = -1 なら self.eta * (1 - (-1)) = 2 self.eta
88
88
 
89
89
  target == self.predict(xi) なら0
90
90
 
@@ -96,11 +96,11 @@
96
96
 
97
97
  正解が0なのに予測が1と誤識別したら
98
98
 
99
- → self.w_[1:] = self.w_[1:] - self.eta * xi と更新
99
+ → self.w_[1:] = self.w_[1:] - self.eta * 2 * xi と更新
100
100
 
101
101
  正解が1なのに予測が0と誤識別したら
102
102
 
103
- → self.w_[1:] = self.w_[1:] + self.eta * xi
103
+ → self.w_[1:] = self.w_[1:] + self.eta * 2 * xi
104
104
 
105
105
  正解と予測が一致したら
106
106
 

4

修正

2020/06/11 09:04

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -109,9 +109,3 @@
109
109
 
110
110
 
111
111
  となっています。
112
-
113
-
114
-
115
-
116
-
117
- w_new = update (target - self.predict(xi))

3

修正

2020/06/11 08:52

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -55,3 +55,63 @@
55
55
 
56
56
 
57
57
  これで1つのサンプルを正しく識別できるように分類超平面を調整したら、今まで正しく識別できていた他のサンプルが逆に誤識別するようになり、全部のサンプルを正しく識別できる重みが見つからないのではないかと心配になるかもしれませんが、線形識別可能 (超平面で2つのクラスのサンプルが完全に分離可能) なデータの場合、有限回の反復で収束する (すべてのサンプルを正しく識別できるようになる) ことが数学的に証明できます。
58
+
59
+
60
+
61
+ ## 追記
62
+
63
+
64
+
65
+ > 質問のように、本のコードは```self.w_[1:] += update * xi```となっています。(誤植ではないと思います)
66
+
67
+ これでよい理由についてわかりませんか?
68
+
69
+
70
+
71
+ 回答では簡略化のために、学習率 self.eta = 1、バイアス self.w_[0] = 0 としましたが、「質問のコードの重み更新でやっていること」と、「上記回答のパーセプトロンの重みの更新」はやっていることは同じですよ。
72
+
73
+ 2次元データだとすると、重みは self.w_ = [b, w0, w1] とバイアス b と重み w0, w1 になりますよね。self.w_[1:] = [w0, w1] なので、
74
+
75
+
76
+
77
+ self.w_[1:] += update * xi
78
+
79
+ → self.w_[1:] += self.eta * (target - self.predict(xi)) * xi
80
+
81
+
82
+
83
+ ここで、self.eta * (target - self.predict(xi)) について考えると、ラベルが0, 1 の2クラスなら
84
+
85
+ target = 0, self.predict(xi) = 1 なら self.eta * (0 - 1) = -self.eta
86
+
87
+ target = 1, self.predict(xi) = 0 なら self.eta * (1 - 0) = self.eta
88
+
89
+ target == self.predict(xi) なら0
90
+
91
+ となります。なので、
92
+
93
+
94
+
95
+
96
+
97
+ 正解が0なのに予測が1と誤識別したら
98
+
99
+ → self.w_[1:] = self.w_[1:] - self.eta * xi と更新
100
+
101
+ 正解が1なのに予測が0と誤識別したら
102
+
103
+ → self.w_[1:] = self.w_[1:] + self.eta * xi
104
+
105
+ 正解と予測が一致したら
106
+
107
+ → self.w_[1:] = self.w_[1:] + 0 * xi = self.w_[1:] (つまり、更新しないのと同じ)
108
+
109
+
110
+
111
+ となっています。
112
+
113
+
114
+
115
+
116
+
117
+ w_new = update (target - self.predict(xi))

2

修正

2020/06/11 08:52

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -54,4 +54,4 @@
54
54
 
55
55
 
56
56
 
57
- これで1つのサンプルを正しく識別できるように分類超平面を調整したら、今まで正しく識別できていた他のサンプルが逆に誤識別するようになり、全部のサンプルを正しく識別できる重みが見つからないのではないかと心配になるかもしれませんが、線形識別可能 (超平面で2つのクラスのサンプルが完全に分離可能) なデータの場合、有限回の反復で収束することが数学的に証明できます。
57
+ これで1つのサンプルを正しく識別できるように分類超平面を調整したら、今まで正しく識別できていた他のサンプルが逆に誤識別するようになり、全部のサンプルを正しく識別できる重みが見つからないのではないかと心配になるかもしれませんが、線形識別可能 (超平面で2つのクラスのサンプルが完全に分離可能) なデータの場合、有限回の反復で収束する (すべてのサンプルを正しく識別できるようになる) ことが数学的に証明できます。

1

修正

2020/06/10 15:43

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -54,4 +54,4 @@
54
54
 
55
55
 
56
56
 
57
- これで1つのサンプルを正しく識別できるように分類超平面を調整したら、今まで正しく識別できていたのが逆に識別できくなったして、全部を正しく識別できる重みが見つからないのではないかと心配になるかもしれませんが、線形識別可能 (超平面で2つのクラスのサンプルが完全に分離可能) なデータの場合、有限回の反復で収束することが数学的に証明できます。
57
+ これで1つのサンプルを正しく識別できるように分類超平面を調整したら、今まで正しく識別できていたサンプルが逆に識別するようになり、全部のサンプルを正しく識別できる重みが見つからないのではないかと心配になるかもしれませんが、線形識別可能 (超平面で2つのクラスのサンプルが完全に分離可能) なデータの場合、有限回の反復で収束することが数学的に証明できます。