Я реализую персептрон, используя Python и Numpy. Я обучаю его с помощью алгоритма, описанного в этой статье Википедии, но полученные веса вектор неправильно классифицирует выборочные векторы, даже те, которые входят в обучающий набор.
Этот тренировочный код я написал:
epochs = 50
unit_step = lambda x: 0 if x < center else (0.5 if x == center else 1)
def train(data_set, labels):
number_of_samples, dimension = data_set.shape
# Generate the augmented data set, adding a column of '1's
augmented_data_set = np.ones((number_of_samples, dimension + 1))
augmented_data_set[:,:-1] = data_set
w = 1e-6 * np.random.rand(dimension + 1)
for _ in xrange(epochs):
for sample, target in zip(augmented_data_set, labels):
predicted_output = unit_step(np.dot(w, sample))
update = (target - predicted_output) * sample
w += update
return w
После этого я установил в качестве обучающего набора необходимые векторы для изучения логической функции И как:
training_set = np.array([[0,0],[0,1],[1,0],[1,1]])
и его соответствующие метки класса как:
labels = np.array([-1,-1,-1,1])
где -1 представляет False, а 1 представляет True.
После запуска w = train(training_set, labels)
я тестирую результирующий вектор весов и получаю неверные результаты:
np.dot(w, [0,0,1]) = -1.0099996334232431
np.dot(w, [0,1,1]) = -1.0099991616719257
np.dot(w, [1,0,1]) = -1.009999277692496
np.dot(w, [1,0,1]) = -1.009999277692496
Ошибка здесь в том, что в последнем случае должно возвращаться значение больше 0 и близкое к 1. Я не вижу ясно, что здесь происходит. Что мне не хватает?
заранее спасибо