Лаб. 2 НС
.docxМОСКОВСКИЙ ИНСТИТУТ ЭЛЕКТРОННОЙ ТЕХНИКИ
Институт системной и программной инженерии и информационных технологий (Институт СПИНТех)
Лабораторная работа № 2
Нейрон Мак-Каллока — Питтса. Перцептрон.
Логические нейронно-сетевые операции
Выполнил:
Фамилия И.О. гр. ???-??
Проверил преподаватель:
проф., д.ф.-м. н. Рычагов М.Н.
Москва, 2026
Задание №1
Ответ:
Подходят все функции, которые можно использовать в многослойной сети, но с условием: функция должна быть дифференцируемой, чтобы работал алгоритм обратного распространения ошибки.
Таблица 1
Рассмотрение функций для решения датасета со спиралью
Функция |
Дифференцируема? |
Можно ли использовать для спирали? |
Единичный скачок |
Нет |
Не подходит |
Кусочно-линейная |
Нет (производная кусочно-постоянна) |
Не подходит |
Сигмоидная функциф |
Да |
Подходит |
Гиперболический тангенс |
Да |
Подходит |
Для спирали следует использовать сигмоидную функцию или гиперболический тангенс.
Задание №2
Gaussian:
Рисунок 1. Нейронная сеть для датасета: Gaussian
Классы можно разделить одной прямой линией. Один нейрон справляется с линейно разделимыми задачами.
Circle:
Рисунок 2. Нейронная сеть для датасета: Circle
Окружность нельзя разделить одной прямой. Первый скрытый слой из 3 нейронов позволяет построить три разделяющие прямые, которые аппроксимируют окружность в виде треугольника. Второй скрытый слой из 2 нейронов комбинирует эти прямые так, чтобы сформировать замкнутую область, близкую к окружности.
Exclusive or:
Рисунок 3. Нейронная сеть для датасета: Exclusive or
Первый скрытый слой выполняет роль «разметки» плоскости. Каждый из четырёх нейронов обучается проводить простые разделяющие линии, которые делят пространство на полосы. Этого достаточно, чтобы разбить плоскость на отдельные полосы, соответствующие строкам и столбцам шахматной доски. Второй скрытый слой комбинирует эти полосы в отдельные квадраты.
Spiral:
Рисунок 4. Нейронная сеть для датасета: Spiral
Первый скрытый слой делит плоскость прямыми линиями, создавая «заготовки» для фрагментов спирали. Второй слой комбинирует эти прямые, получая отдельные части спирали. Третий слой комбинирует получившиеся части.
Задание №3
Код:
def McCulloch_Pitts_AND(): print('Введите веса') w1 = float(input('Вес w1 = ')) w2 = float(input('Вес w2 = ')) print('Введите величину порога') theta = float(input('Порог = ')) y = [0, 0, 0, 0] x1 = [1, 1, 0, 0] x2 = [1, 0, 1, 0] z = [1, 0, 0, 0] con = 1 while con: zin = [x1[i] * w1 + x2[i] * w2 for i in range(4)] for i in range(4): if zin[i] >= theta: y[i] = 1 else: y[i] = 0 print('Значение на выходе нейрона') print(y) if y == z: con = 0 else: print('Нейрон не обучен. Введите другие значения весовых коэффициентов и порога') w1 = float(input('Вес w1 = ')) w2 = float(input('Вес w2 = ')) theta = float(input('Порог = ')) print('Нейрон МакКаллока-Питса для функции "И" (англ. "AND")') print('Веса нейрона') print(w1) print(w2) print('Пороговое значение') print(theta) McCulloch_Pitts_AND()
Вывод:
Задание №4
Код:
def McCulloch_Pitts_AND_bipolar(): print('Введите веса') w1 = float(input('Вес w1 = ')) w2 = float(input('Вес w2 = ')) print('Введите величину порога') theta = float(input('Порог = ')) y = [0, 0, 0, 0] x1 = [-1, -1, 1, 1] x2 = [-1, 1, -1, 1] z = [-1, -1, -1, 1] con = 1 while con: zin = [x1[i] * w1 + x2[i] * w2 for i in range(4)] for i in range(4): if zin[i] >= theta: y[i] = 1 else: y[i] = -1 print('Значение на выходе нейрона') print(y) if y == z: con = 0 else: print('Нейрон не обучен. Введите другие значения весовых коэффициентов и порога') w1 = float(input('Вес w1 = ')) w2 = float(input('Вес w2 = ')) theta = float(input('Порог = ')) print('Нейрон МакКаллока-Питса для функции "И" (англ. "AND") в биполярной логике') print('Веса нейрона') print(w1) print(w2) print('Пороговое значение') print(theta) McCulloch_Pitts_AND_bipolar()
Вывод:
Задание №5
Код:
def McCulloch_Pitts_XOR(): print('Введите веса первого скрытого нейрона') w11_h1 = float(input('Вес w_11 (от x1 к первому скрытому нейрону) = ')) w12_h1 = float(input('Вес w_12 (от x2 к первому скрытому нейрону) = ')) print('Введите веса второго скрытого нейрона') w21_h2 = float(input('Вес w_21 (от x1 ко второму скрытому нейрону) = ')) w22_h2 = float(input('Вес w_22 (от x2 ко второму скрытому нейрону) = ')) print('Введите веса выходного нейрона') w11_out = float(input('Вес w11 (от первого скрытого к выходу) = ')) w12_out = float(input('Вес w12 (от второго скрытого к выходу) = ')) print('Введите величину порога') theta = float(input('Порог = ')) x1 = [1, 1, 0, 0] x2 = [1, 0, 1, 0] z = [0, 1, 1, 0] con = 1 while con: # Выходы скрытых нейронов h1 = [] h2 = [] for i in range(4): # Первый скрытый нейрон zin_h1 = x1[i] * w11_h1 + x2[i] * w12_h1 h1.append(1 if zin_h1 >= theta else 0) # Второй скрытый нейрон zin_h2 = x1[i] * w21_h2 + x2[i] * w22_h2 h2.append(1 if zin_h2 >= theta else 0) # Выходной нейрон y = [] for i in range(4): zin_out = h1[i] * w11_out + h2[i] * w12_out y.append(1 if zin_out >= theta else 0) print('Значения на выходе сети') print(y) if y == z: con = 0 else: print('Сеть не обучена. Введите другие значения весов и порога') w11_h1 = float(input('Вес w_11 = ')) w12_h1 = float(input('Вес w_12 = ')) w21_h2 = float(input('Вес w_21 = ')) w22_h2 = float(input('Вес w_22 = ')) w11_out = float(input('Вес w11 = ')) w12_out = float(input('Вес w12 = ')) theta = float(input('Порог = ')) print('Нейрон МакКаллока-Питса для функции "Исключающее-ИЛИ" (англ. "XOR")') print('Веса первого скрытого нейрона:') print('w_11 =', w11_h1) print('w_12 =', w12_h1) print('Веса второго скрытого нейрона:') print('w_21 =', w21_h2) print('w_22 =', w22_h2) print('Веса выходного нейрона:') print('w11 =', w11_out) print('w12 =', w12_out) print('Пороговое значение') print(theta) McCulloch_Pitts_XOR()
Вывод:
