回答編集履歴
5
d
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
書籍のコードは GitHub に上がっているようなので、動かない場合はこちらのものと比較すると思います。
|
19
|
+
書籍のコードは GitHub に上がっているようなので、動かない場合はこちらのものと比較するとよいかと思います。
|
20
20
|
|
21
21
|
|
22
22
|
|
4
d
test
CHANGED
@@ -1,177 +1,23 @@
|
|
1
|
-
|
1
|
+
コピペミスだと思いますが、シグモイド関数の分母の指数が e^{-x} でなく、e^x になっていて、間違っています。
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
```diff
|
6
6
|
|
7
|
-
|
7
|
+
- 1.0 / (1.0 + np.exp(np.clip(z, -250, 250)))
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
```python
|
12
|
-
|
13
|
-
import matplotlib.pyplot as plt
|
14
|
-
|
15
|
-
import numpy as np
|
16
|
-
|
17
|
-
from matplotlib.colors import ListedColormap
|
18
|
-
|
19
|
-
from sklearn.datasets import make_blobs
|
20
|
-
|
21
|
-
from sklearn.linear_model import LogisticRegression
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
class LogisticRegressionGD(object):
|
28
|
-
|
29
|
-
def __init__(self, eta=0.05, n_iter=100, random_state=1):
|
30
|
-
|
31
|
-
self.eta = eta
|
32
|
-
|
33
|
-
self.n_iter = n_iter
|
34
|
-
|
35
|
-
self.random_state = random_state
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
def fit(self, X, y):
|
40
|
-
|
41
|
-
rgen = np.random.RandomState(self.random_state)
|
42
|
-
|
43
|
-
self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])
|
44
|
-
|
45
|
-
self.cost_ = []
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
for i in range(self.n_iter):
|
50
|
-
|
51
|
-
net_input = self.net_input(X)
|
52
|
-
|
53
|
-
output = self.activation(net_input)
|
54
|
-
|
55
|
-
errors = y - output
|
56
|
-
|
57
|
-
self.w_[1:] += self.eta * X.T.dot(errors)
|
58
|
-
|
59
|
-
self.w_[0] += self.eta * errors.sum()
|
60
|
-
|
61
|
-
cost = -y.dot(np.log(output)) - ((1 - y).dot(np.log(1 - output)))
|
62
|
-
|
63
|
-
self.cost_.append(cost)
|
64
|
-
|
65
|
-
return self
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
def net_input(self, X):
|
70
|
-
|
71
|
-
return np.dot(X, self.w_[1:]) + self.w_[0]
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
def activation(self, z):
|
76
|
-
|
77
|
-
|
9
|
+
+ 1.0 / (1.0 + np.exp(-np.clip(z, -250, 250)))
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
def predict(self, X):
|
82
|
-
|
83
|
-
return np.where(self.net_input(X) >= 0.0, 1, 0)
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
def plot_decision_regions(x, y, classifier, test_idx=None, resolution=0.02):
|
90
|
-
|
91
|
-
markers = ("s", "x", "o", "^", "v")
|
92
|
-
|
93
|
-
colors = ("blue", "red", "lightgreen", "gray", "cyan")
|
94
|
-
|
95
|
-
cmap = ListedColormap(colors[: len(np.unique(y))])
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1
|
100
|
-
|
101
|
-
x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
xx1, xx2 = np.meshgrid(
|
106
|
-
|
107
|
-
np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)
|
108
|
-
|
109
|
-
)
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
z = z.reshape(xx1.shape)
|
118
|
-
|
119
|
-
plt.contourf(xx1, xx2, z, alpha=0.8, cmap=cmap)
|
120
|
-
|
121
|
-
plt.xlim(xx1.min(), xx1.max())
|
122
|
-
|
123
|
-
plt.ylim(xx2.min(), xx2.max())
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
for idx, c1 in enumerate(np.unique(y)):
|
128
|
-
|
129
|
-
plt.scatter(
|
130
|
-
|
131
|
-
x=x[y == c1, 0],
|
132
|
-
|
133
|
-
y=x[y == c1, 1],
|
134
|
-
|
135
|
-
alpha=0.8,
|
136
|
-
|
137
|
-
c=colors[idx],
|
138
|
-
|
139
|
-
marker=markers[idx],
|
140
|
-
|
141
|
-
label=c1,
|
142
|
-
|
143
|
-
edgecolor="black",
|
144
|
-
|
145
|
-
)
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
# データを作成する。
|
152
|
-
|
153
|
-
X, y = make_blobs(
|
154
|
-
|
155
|
-
random_state=0, n_samples=200, n_features=2, cluster_std=0.8, centers=2
|
156
|
-
|
157
|
-
)
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
# ロジスティック回帰モデルで学習する。
|
164
|
-
|
165
|
-
model = LogisticRegressionGD(eta=0.05, n_iter=1000, random_state=1).fit(X, y)
|
166
|
-
|
167
|
-
plot_decision_regions(X, y, model)
|
168
10
|
|
169
11
|
```
|
170
12
|
|
171
13
|
|
172
14
|
|
173
|
-
![イメージ説明](
|
15
|
+
![イメージ説明](9da8000629acd92bb4066f7155375b9c.png)
|
174
16
|
|
175
17
|
|
176
18
|
|
177
|
-
|
19
|
+
書籍のコードは GitHub に上がっているようなので、動かない場合はこちらのものと比較すると思います。
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
[python-machine-learning-book-2nd-edition/ch03.ipynb at master · rasbt/python-machine-learning-book-2nd-edition](https://github.com/rasbt/python-machine-learning-book-2nd-edition/blob/master/code/ch03/ch03.ipynb)
|
3
d
test
CHANGED
@@ -14,19 +14,73 @@
|
|
14
14
|
|
15
15
|
import numpy as np
|
16
16
|
|
17
|
+
from matplotlib.colors import ListedColormap
|
18
|
+
|
17
19
|
from sklearn.datasets import make_blobs
|
18
20
|
|
19
21
|
from sklearn.linear_model import LogisticRegression
|
20
22
|
|
21
23
|
|
22
24
|
|
23
|
-
# データを作成する。
|
24
25
|
|
25
|
-
X, y = make_blobs(
|
26
26
|
|
27
|
-
|
27
|
+
class LogisticRegressionGD(object):
|
28
28
|
|
29
|
+
def __init__(self, eta=0.05, n_iter=100, random_state=1):
|
30
|
+
|
31
|
+
self.eta = eta
|
32
|
+
|
33
|
+
self.n_iter = n_iter
|
34
|
+
|
35
|
+
self.random_state = random_state
|
36
|
+
|
37
|
+
|
38
|
+
|
29
|
-
)
|
39
|
+
def fit(self, X, y):
|
40
|
+
|
41
|
+
rgen = np.random.RandomState(self.random_state)
|
42
|
+
|
43
|
+
self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])
|
44
|
+
|
45
|
+
self.cost_ = []
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
for i in range(self.n_iter):
|
50
|
+
|
51
|
+
net_input = self.net_input(X)
|
52
|
+
|
53
|
+
output = self.activation(net_input)
|
54
|
+
|
55
|
+
errors = y - output
|
56
|
+
|
57
|
+
self.w_[1:] += self.eta * X.T.dot(errors)
|
58
|
+
|
59
|
+
self.w_[0] += self.eta * errors.sum()
|
60
|
+
|
61
|
+
cost = -y.dot(np.log(output)) - ((1 - y).dot(np.log(1 - output)))
|
62
|
+
|
63
|
+
self.cost_.append(cost)
|
64
|
+
|
65
|
+
return self
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
def net_input(self, X):
|
70
|
+
|
71
|
+
return np.dot(X, self.w_[1:]) + self.w_[0]
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
def activation(self, z):
|
76
|
+
|
77
|
+
return 1.0 / (1.0 + np.exp(-np.clip(z, -250, 250)))
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
def predict(self, X):
|
82
|
+
|
83
|
+
return np.where(self.net_input(X) >= 0.0, 1, 0)
|
30
84
|
|
31
85
|
|
32
86
|
|
@@ -94,9 +148,21 @@
|
|
94
148
|
|
95
149
|
|
96
150
|
|
151
|
+
# データを作成する。
|
152
|
+
|
153
|
+
X, y = make_blobs(
|
154
|
+
|
155
|
+
random_state=0, n_samples=200, n_features=2, cluster_std=0.8, centers=2
|
156
|
+
|
157
|
+
)
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
|
97
163
|
# ロジスティック回帰モデルで学習する。
|
98
164
|
|
99
|
-
model = LogisticRegression(
|
165
|
+
model = LogisticRegressionGD(eta=0.05, n_iter=1000, random_state=1).fit(X, y)
|
100
166
|
|
101
167
|
plot_decision_regions(X, y, model)
|
102
168
|
|
2
d
test
CHANGED
@@ -13,10 +13,6 @@
|
|
13
13
|
import matplotlib.pyplot as plt
|
14
14
|
|
15
15
|
import numpy as np
|
16
|
-
|
17
|
-
from matplotlib.colors import ListedColormap
|
18
|
-
|
19
|
-
from sklearn import datasets
|
20
16
|
|
21
17
|
from sklearn.datasets import make_blobs
|
22
18
|
|
1
d
test
CHANGED
@@ -109,3 +109,7 @@
|
|
109
109
|
|
110
110
|
|
111
111
|
![イメージ説明](6b8febd777e2382cb6a353d0e82aebe7.jpeg)
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
もし、上記のようにならない場合は、現状の図を質問欄に貼ってください
|