Generates a 2D linearly separable dataset with 2n samples.
The third element of the sample is the label
"""
- xb = (rand(n) * 2 - 1) / 2 - 0.5
+ xb = (rand(n) * 2 - 1) / 2 + 0.5
yb = (rand(n) * 2 - 1) / 2
xr = (rand(n) * 2 - 1) / 2 + 1.5
yr = (rand(n) * 2 - 1) / 2 - 0.5
return inputs
-training_set_size = 100
-training_set = generateData(training_set_size)
+training_set_size = 150
+training_set = generateData2(training_set_size)
data = np.array(training_set)
X = data[:, 0:2]
Y = data[:, -1]
classification_error = 1
while not classification_error == 0:
classification_error = 0
- for i in range(X.shape[0]):
- if Y[i] * np.dot(w, X[i]) <= 0:
- classification_error = classification_error + 1
- w = w + Y[i] * X[i]
+ for x, y in zip(X, Y):
+ if y * np.dot(w, x) <= 0:
+ classification_error += 1
+ w = w + y * x
+ print(classification_error)
return w
def complete(sample):
- sample = np.expand_dims(sample, axis=0)
- return sample
+ new_sample = np.insert(sample, len(sample[0]), [1], axis=1)
+ return np.array(new_sample)
+X = complete(X)
w = perceptron_nobias(X, Y)
-pl.plot([-1, 1], [w[0] / w[1], -w[0] / w[1]])
+# w is orthogonal to the hyperplan
+# with generateData
+# plot arguments format is pl.plot([x1,x2],[y1,y2])
+# w[0]x + w[1]y = 0, so y = -w[0]x / w[1]
+# pl.plot([-1, 1], [w[0] / w[1], -w[0] / w[1]])
+# with generateData2 and complete
+# w[0]x + w[1]y + w[2] = 0, so y = -(w[0]x + w[2]) / w[1]
+x_start1 = -0.5
+x_start2 = 2.5
+pl.plot([x_start1, x_start2], [-(w[0] * x_start1 + w[2]) /
+ w[1], -(w[0] * x_start2 + w[2]) / w[1]])
pl.scatter(X[:, 0], X[:, 1], c=Y, s=training_set_size)
+pl.title(u"Perceptron - hyperplan")
pl.show()