Материал: Лабораторная работа 2

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Результат запуска программы представлен на рис. 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