Код программы, моделирующей, обучающей и тестирующей работу нейронной сети, на языке Python с использованием библиотеки Neurolab представлен в табл. 5.
Таблица 5 — Код на Python (Neurolab)
program2.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]
# Проверочная выборка (14 вариант)
A = np.array([[0, 1, -1], [1, -1, -1]], float)
Axy = list(zip(*A))
#Axy = [[x, y] for x in range(-8, 12 + 1) for y in range(-8, 12 + 1)]
#Маркеры центров классов
center_markers = ['k*', 'kx', 'ks', 'kd']
#Маркеры классов обучающей выборки (по классам) training_markers = ['r*', 'rx', 'rs', 'rd']
#Маркеры классов проверочной выборки (по классам) test_markers = ['b*', 'bx', 'bs', 'bd']
#Минимальные и максимальные значения координат min_c = min([-10, min(X), min(Y)])
max_c = max([+10, max(X), max(Y)])
#=== Построение нейронной сети Кохонена ===
#Диапазон значений входов: от -10 до 10; 4 класса
net = nl.net.newc([[min_c, max_c], [min_c, max_c]], 4)
#Обучение сети
error = net.train(P, epochs=200, show=0)[-1]
while error > 34: # До тех пор, пока ошибка не будет приемлемой2 error = net.train(P, epochs=200, show=0)[-1]
W = net.layers[0].np['w'] # Матрица весов
#Моделирование работы нейронной сети на проверочной выборке a = net.sim(Axy)
#Визуализация полученного результата
pyplot.figure(figsize=(5, 5), dpi=90) # Создание нового окна с графиком
#Функция построения точек p согласно указанным в sim_p классам
#и стилем, задаваемым markers
def plot_sim_p(p, sim_p, markers): for i in range(sim_p.shape[0]):
for j in range(sim_p.shape[1]): if sim_p[i][j] == 1:
pyplot.plot(p[i][0], p[i][1], markers[j]) break
p = net.sim(P) # Моделирование работы на обучающей выборке |
|
||
plot_sim_p(P, p, training_markers) |
# Построение |
обучающей |
выборки |
# Центры кластеров |
|
|
|
pyplot.plot(W[0, 0], W[0, 1], center_markers[0], |
W[1, 0], W[1, 1], center_markers[1], |
||
W[2, 0], W[2, 1], center_markers[2], |
W[3, 0], W[3, 1], center_markers[3]) |
||
plot_sim_p(Axy, a, test_markers) |
# Построение проверочной |
выборки |
|
pyplot.axis([(min_c + 2), (max_c + 2), (min_c + 2), (max_c |
+ 2)]) # Установка границ |
||
pyplot.xlabel('X') |
|
|
|
2Результат работы зависит от начальных установок сети. Итоговая ошибка обычно варьируется от 33 до 60.
6
pyplot.ylabel('Y') pyplot.grid() pyplot.show()
Результат запуска программы представлен на рис. 4, 5.
Рисунок 4 — Общая классификация
Рисунок 5 — Классификация сетки точек
Заключение В результате выполнения лабораторной работы мы изучили модель
слоя Кохонена и алгоритм обучения без учителя; создали и исследовали модель слоя Кохонена в системе MATLAB и с использованием языка программирования Python с библиотекой Neurolab.
Применение функций пакета Neural Network Toolbox существенно упрощает построение, обучение и использование ИНС.
7