Ошибка неправильной классификации в персептроне

Я реализую персептрон, используя 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. Я не вижу ясно, что здесь происходит. Что мне не хватает?

заранее спасибо


person tulians    schedule 30.10.2016    source источник
comment
Независимо от вашего кода персептрон строит статистическую модель на основе входных данных для обучения. Не ожидайте, что это будет на 100% правильно на обучающих данных. В вашем случае я бы попытался увеличить количество эпох — я понятия не имею, сколько времени потребуется персептрону, чтобы сойтись на таком маленьком обучающем наборе.   -  person alexis    schedule 30.10.2016


Ответы (1)


Наиболее очевидной ошибкой является отсутствие унификации между метками тренировочного набора (-1 и 1) и тем, что выводит ваша модель (0, 0,5 и 1,0). Измените оба на 0 и 1.

person lejlot    schedule 30.10.2016