Простой персептрон в Python - PullRequest
2 голосов
/ 12 марта 2012

http://en.wikipedia.org/wiki/Perceptron#Example

Мой вопрос: почему в каждом векторе 3 входных значения, когда NAND принимает только 2 параметра и возвращает 1:

http://en.wikipedia.org/wiki/Sheffer_stroke#Definition

Вставленный код для вашего удобства:

th = 0.1
learning_rate = 0.1
weights = [0, 0, 0]
training_set = [((1, 0, 0), 1), ((1, 0, 1), 1), ((1, 1, 0), 1), ((1, 1, 1), 0)]

def sum_function(values):
    return sum(value * weights[index] for index, value in enumerate(values))

while True:
    print '-' * 60
    error_count = 0
    for input_vector, desired_output in training_set:
        print weights
        result = 1 if sum_function(input_vector) > th else 0
        error = desired_output - result
        if error != 0:
            error_count += 1
            for index, value in enumerate(input_vector):
                weights[index] += learning_rate * error * value
    if error_count == 0:
        break

Ответы [ 4 ]

2 голосов
/ 06 мая 2012

Это потому, что вам нужно одно значение, которое является постоянным вводом. - также известный как уклон.

Если вы заметили, что у вас также есть три веса, то первый элемент в тройке (который, кажется, всегда равен 1) должен рассматриваться как «входной 0» (смещение). Это константа.

Я бы посоветовал взглянуть на видео на YouTube: Простое объяснение нейронных сетей

надеюсь, это поможет

1 голос
/ 30 мая 2017

В этой задаче мы пытаемся изучить функцию NAND.И поэтому входной вектор равен (a,b,a NAND b), а желаемый выходной сигнал определяет, является ли эта входная комбинация правильной или неправильной, то есть является ли она правильным представлением функции NAND.

Например, ((1,1,1), 0) означает 1 NAND 1 = 1 неверно и поэтому классифицируется как 0 (неверно).((1,1,0), 1) означает, что 1 NAND 1 = 0 является правильным, и поэтому оно классифицируется как 1 (Правильно).

А так как другие комбинации добавляются как часть обучающих данных, тогда классификатор изучит функцию NAND.Ниже приведены еще несколько кортежей, которые можно добавить к тренировочным данным.

((0,0,1),1)
((0,1,1),1)
((1,0,1),1)
((0,0,0),0)
((0,1,0),0)
((1,0,0),0)
0 голосов
/ 31 октября 2012

Мой ответ на Java, я только вхожу в Python, поэтому я обновлю этот ответ, когда доберусь до него.

boolean nand(boolean[] a) {
  boolean b = true
  if (a.length > 1) {
    b = a[0] && a[1];
    if (a.length > 2)
      for (int i = 2; i < a.length; i++)
        b &= a[i];
  }
  return !b;
}

Использование (должно возвращать true):

nand(training_set[i][0]) == training_set[i][1]

Редактировать

Через два года я вернулся к этому вопросу, чтобы добавить к своему ответу ...

Я создал итеративное и рекурсивное решение в python.Я также попытался закодировать гольф рекурсивно.Я получил его до 106 байт.

Реализации

Итеративный

def nand(*a):
    if len(a) > 1:
        b = a[0] and a[1]
        if len(a) > 2:
            for i in range(2, len(a)):
                b = b and a[i]
        return not b
    return None

Рекурсивный

def nand(*a):
    if len(a) < 2:
        return None
    elif len(a) == 2:
        return not (a[0] and a[1])
    else:
        return nand(*([a[0] and a[1]] + list(a[2:])))

Рекурсивный (лямбда)

nand=lambda*a:None if len(a)<2 else not(a[0]and a[1])if len(a)==2 else nand(*([a[0]and a[1]]+list(a[2:])))

Результаты

print nand(True,  True,  True)   #  ¬(1 ∧ 1 ∧ 1) == 0
print nand(True,  True,  False)  #  ¬(1 ∧ 1 ∧ 0) == 1
print nand(True,  False, True)   #  ¬(1 ∧ 0 ∧ 1) == 1
print nand(True,  False, False)  #  ¬(1 ∧ 0 ∧ 0) == 1
print nand(False, True,  True)   #  ¬(0 ∧ 1 ∧ 1) == 1
print nand(False, True,  False)  #  ¬(0 ∧ 1 ∧ 0) == 1
print nand(False, False, True)   #  ¬(0 ∧ 0 ∧ 1) == 1
print nand(False, False, False)  #  ¬(0 ∧ 0 ∧ 0) == 1
0 голосов
/ 12 марта 2012

NAND может принимать столько аргументов, сколько вы захотите.Просто И все входные значения вместе и отрицательный выход.

// 2 arguments
!(A & B)

// 3 arguments
!(A & B & C)

// n argument
!(A & B & ... & n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...