Результат запуска программы представлен на рис. 6, 7, 8, 9.
Рисунок 6 — Классификация I (слева-направо)
Рисунок 7 — Классификация II (сверху-вниз)
Рисунок 8 — Общая классификация
11
Рисунок 9 — Классификация сетки точек Код программы, моделирующей, обучающей и тестирующей работу
персептрона, на языке Python с использованием библиотеки Neurolab представлен в табл. 7.
Таблица 7 — Код на Python (Neurolab)
program4.py
"""
Python 3.8.8 (tags/v3.8.8:024d805, Feb 19 2021, 13:18:16) [MSC v.1928 64 bit (AMD64)] on win32
-neurolab version is 0.3.5
-matplotlib version is 3.3.4
-numpy version is 1.19.5
"""
import neurolab as nl import numpy as np
from matplotlib import pyplot
# === Исходные данные === |
|
|
# Обучающая выборка из 15 точек |
|
|
X = np.array([3, 5, 4, 6, -4, -2, -4, -3, 6, 6, 8, 7, |
-2, -4, -2, -3], float) |
|
Y = np.array([-1, -1, -3, 1, -2, -2, -4, -4, 9, 6, 6, |
4, 6, 4, 4, 2], float) |
|
P = np.c_[X, Y] |
|
|
# Результаты классификации точек обучающей выборки |
|
|
T1 = np.array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, |
1, 1, 1], int) |
# Классификация |
I (слева-направо) |
|
|
T2 = np.array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, |
1, 1, 1], int) |
# Классификация |
II (сверху-вниз) |
|
|
T = np.c_[T1, T2] |
|
|
#Минимальные и максимальные значения координат min_c = min((min(X), min(Y), -10))
max_c = max((max(X), max(Y), 10))
#Отображение графика классификации I точек обучающей выборки pyplot.figure(figsize=(5, 5), dpi=90) # Создание окна номер 1 с фигурой pyplot.axis([min_c, max_c, min_c, max_c]) # Настройка границ
X1, Y1 = zip(*((x, y) for x, y, t in zip(X, Y, T1) if t == 0))
X2, Y2 = zip(*((x, y) for x, y, t in zip(X, Y, T1) if t == 1))
pyplot.plot(X1, Y1, color='red', marker='+', linewidth=0) # Построение графика pyplot.plot(X2, Y2, color='blue', marker='x', linewidth=0) # Построение графика pyplot.grid()
#Отображение графика классификации II точек обучающей выборки pyplot.figure(figsize=(5, 5), dpi=90) # Создание окна номер 2 с фигурой pyplot.axis([min_c, max_c, min_c, max_c]) # Настройка границ
X1, Y1 = zip(*((x, y) for x, y, t in zip(X, Y, T2) if t == 0))
X2, Y2 = zip(*((x, y) for x, y, t in zip(X, Y, T2) if t == 1))
pyplot.plot(X1, Y1, color='red', marker='+', linewidth=0) # Построение графика pyplot.plot(X2, Y2, color='blue', marker='x', linewidth=0) # Построение графика
12
pyplot.grid()
#Проверочная выборка (14 вариант) test = [[0, 1, -1], [1, -1, -1]] test_xy = list(zip(*test))
#test_xy = [[x, y] for x in range(-10, 10 + 1) for y in range(-10, 10 + 1)]
#=== Построение персептрона с помощью Neurolab ===
#Создание перцептрона с 2 входами и 2 нейронами
#В качестве функции активации персептрона по умолчанию используется функция hardlim
(Hard-limit transfer function)
net = nl.net.newp([[min_c, max_c], [min_c, max_c]], 2) net.train(P, T, epochs=50, lr=0.1)
test_output = net.sim(test_xy)
#Создание нового окна с графиком и настройка границ
pyplot.subplots(figsize=(5, 5), dpi=90) pyplot.axis([min_c, max_c, min_c, max_c])
# Обучающая выборка
training_sample = [[[[], []], [[], []]], [[[], []], [[], []]]]
R = map(lambda t: map(round, t), T) for (x, y), (t0, t1) in zip(P, R):
training_sample[t0][t1][0].append(x) training_sample[t0][t1][1].append(y)
pyplot.plot(training_sample[0][0][0], training_sample[0][0][1], color='red', marker='+', linewidth=0)
pyplot.plot(training_sample[0][1][0], training_sample[0][1][1], color='green', marker='x', linewidth=0)
pyplot.plot(training_sample[1][0][0], training_sample[1][0][1], color='blue', marker='*', linewidth=0)
pyplot.plot(training_sample[1][1][0], training_sample[1][1][1], color='purple', marker='D', linewidth=0)
# Проверочная выборка
test_sample = [[[[], []], [[], []]], [[[], []], [[], []]]]
R = map(lambda t: map(round, t), test_output) for (x, y), (t0, t1) in zip(test_xy, R):
test_sample[t0][t1][0].append(x) test_sample[t0][t1][1].append(y)
pyplot.plot(test_sample[0][0][0], test_sample[0][0][1], color='black', marker='+', linewidth=0)
pyplot.plot(test_sample[0][1][0], test_sample[0][1][1], color='black', marker='x', linewidth=0)
pyplot.plot(test_sample[1][0][0], test_sample[1][0][1], color='black', marker='*', linewidth=0)
pyplot.plot(test_sample[1][1][0], test_sample[1][1][1], color='black', marker='D', linewidth=0)
# Построение разделяющих линий perceptron_weights = net.layers[0].np['w'] perceptron_biases = net.layers[0].np['b']
#Первая линия x1, x2 = min_c, max_c
k1 = -perceptron_weights[0][0] / perceptron_weights[0][1] b1 = -perceptron_biases[0] / perceptron_weights[0][1] y11, y12 = (k1 * x1 + b1, k1 * x2 + b1)
#Вторая линия
k2 = -perceptron_weights[1][0] / perceptron_weights[1][1] b2 = -perceptron_biases[1] / perceptron_weights[1][1] y21, y22 = (k2 * x1 + b2, k2 * x2 + b2)
#Построение линий
pyplot.plot([x1, x2], [y11, y12], color='blue') pyplot.plot([x1, x2], [y21, y22], color='red') pyplot.grid()
pyplot.show()
13
Результат запуска программы представлен на рис. 10, 11, 12, 13.
Рисунок 10 — Классификация I (слева-направо)
Рисунок 11 — Классификация II (сверху-вниз)
Рисунок 12 — Общая классификация
14
Рисунок 13 — Классификация сетки точек
Заключение В результате выполнения лабораторной работы мы изучили модель
нейрона перцептрона и архитектуру перцептронной однослойной нейронной сети; создали и исследовали модели перцептронных нейронных сетей в системе MATLAB и с использованием языка программирования Python с библиотекой Keras и с библиотекой Neurolab.
Использование персептронов уместно и рационально для решения задач классификации, однако ряд более сложных задач он решать не в состоянии. В частности, известна т. н. проблема исключающего ИЛИ, в результате которой персептрон пригоден для классификации только линейно разделимых объектов. Данные ограничения снимаются в случае применения двухслойной нейронной сети. Основное преимущество НС — возможность решения задач, плохо поддающихся формализации. Один из основных недостатков — невозможность заранее предсказать, какое время потребуется на обучение сети.
Применение функций пакета Neural Network Toolbox существенно упрощает построение, обучение и использование ИНС.
15