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:
+ for x, y in zip(X, Y):
+ if y * np.dot(w, x) <= 0:
classification_error += 1
- w = w + Y[i] * X[i]
+ w = w + y * x
+ print(classification_error)
return w
def f_from_k(coeffs, support_set, k, x):
output = 0
for c, s in zip(coeffs, support_set):
- output += c * s[0] * k(s[1], x)
+ output += c * s[1] * k(s[0], x)
return output
+ X1[0] * X1[1] * X2[0] * X2[1] + X1[1]**2 * X2[1]**2
-def kg(x, y, sigma=10):
+def kg(x, y):
+ # sigma = 20 # do not converge
+ # sigma = 10 # do not converge
+ sigma = 1
+ # sigma = 0.5 # overfitting
+ # sigma = 0.2 # overfitting
return np.exp(-((x[0] - y[0])**2 + (x[1] - y[1])**2) / sigma**2)
def perceptron_k(X, Y, k):
coeffs = []
- support_set = np.array([])
+ support_set = []
# Go in the loop at least one time
classification_error = 1
while not classification_error == 0:
classification_error = 0
- for i in range(X.shape[0]):
- if Y[i] * f_from_k(coeffs, support_set, k, X[i]) <= 0:
+ for x, y in zip(X, Y):
+ if y * f_from_k(coeffs, support_set, k, x) <= 0:
+ if x not in support_set:
+ support_set.append((x, y))
+ coeffs.append(1)
+ else:
+ coeffs[support_set.index((x, y))] += 1
classification_error += 1
- np.append(support_set, X[i])
- coeffs.append(1)
- else:
- coeffs[len(coeffs) - 1] = coeffs[len(coeffs) - 1] + 1
- return np.array(coeffs), support_set
+ print(classification_error)
+ return np.array(coeffs), np.array(support_set)
def f(w, x, y):
pl.scatter(X[:, 0], X[:, 1], c=Y, s=training_set_size)
-pl.title(u"Perceptron - hyperplan")
+pl.title(u"Perceptron - prolontaged hyperplan")
-# coeffs, support_set = perceptron_k(X, Y, k1)
-# coeffs, support_set = perceptron_k(X, Y, kg)
+# k = k1
+# coeffs, support_set = perceptron_k(X, Y, k)
+k = kg
+coeffs, support_set = perceptron_k(X, Y, k)
res = training_set_size
-# for c, X in zip(coeffs, support_set):
-# pl.plot(X[0], 'xr')
-
-X = apply_plongement(X, plongement_phi)
-w = perceptron_nobias(X, Y)
for x in range(res):
for y in range(res):
- if abs(f(w, -3 / 2 + 3 * x / res, -3 / 2 + 3 * y / res)) < 0.01:
- pl.plot(-3 / 2 + 3 * x / res, -3 / 2 + 3 * y / res, 'xb')
+ if abs(f_from_k(coeffs, support_set, k, [-3 / 2 + 3 * x / res, -3 / 2 + 3 * y / res])) < 0.01:
+ pl.plot(-3 / 2 + 3 * x / res, -3 / 2 + 3 * y / res, 'xr')
+
+# X = apply_plongement(X, plongement_phi)
+# w = perceptron_nobias(X, Y)
+# for x in range(res):
+# for y in range(res):
+# if abs(f(w, -3 / 2 + 3 * x / res, -3 / 2 + 3 * y / res)) < 0.01:
+# pl.plot(-3 / 2 + 3 * x / res, -3 / 2 + 3 * y / res, 'xb')
pl.show()