Создание, настройка и обучение карт Кохонена.




Чтобы сократить текст m-файла, повторяющиеся команды можно вынести в отдельный файл и оформить его как функцию, задав её параметры и возвращаемые значения:

function [net,kk,mr]=foo(a,b,X)

[kv,kf]=size(X);

net=som(kf,[a,b]);

Функция выполняет создание, обучение и обработку результатов обучения сети.

Приступаем к написанию тела функции. Перед созданием сети нужно определить количество входов нейросетевой модели. Оно равно количеству факторов, т.е. столбцов в массиве X:

[kv,kf]=size(X);

Следующая команда создаёт карту Кохонена net размерностью axb:

net=som(kf,[a,b]);

Где вместо a и b будут показаны фактические значения.

После перед запуском обучения сети необходимо задать его параметры.

Зададим начальные и конечные значения. Все параметры обучения задаются через массив с ключевых именем options:

options(14)=500; #кол-во эпох

options(18)=0.1; #начальная скорость обучения

options(16)=0.01; #конечная скорость обучения

options(17)=0.25*b; #начальный радиус функции соседства

options(15)=1; #конечный радиус функции соседства

Обучение сети net на массиве данных X с заданными параметрами options осуществляется следующей командой:

net=somtrain(net,options,X);

Далее определим номера нейронов победителей Y:

[D2,Y]=somfwd(net,X); # номера нейронов победителей

Первый выходной параметр данной функции D2 – матрица, в которой на пересечении i-й строки и j-го столбца находится квадрат евклидова расстояния между вектором данных i и весовым вектором нейрона j. В дальнейшем исследовании этот массив не требуется.

Количество кластеров – количество несовпадающих номеров нейров-победителей в массиве Y. Сами номера можно получить с помощью функции intersect. Данная функция служит для определения пересечения, она выдаст массив из элементов, которые принадлежат обоим массивам

NN=intersect(Y,Y); #номера нейронов получивших активацию

kk=length(NN); #количество кластеров

Далее приступаем к расчёту среднего межкластерного расстояния. Это среднее расстояние между центроидами кластеров. В карте самоорганизации центроидами являются весовые векторы нейронов. Получим матрицу весовых коэффициентов сети:

W=sompak(net); # матрица весовых коэффициентов

Весовые векторы – строки матрицы W.

Используем массив с номерами нейронов-победителей, скопируем только соответствующие им строки в новую матрицу:

W1=W(NN,:); # массив с номерами нейронов-победителей

Рассчитаем суммарное векторное расстояние SED и разделим на количество кластеров, чтобы определить среднее межкластерное расстояние:

SED=0;

for i=1:kk

for j=1:kk

SED=SED+sqrt(sum((W1(i,:)-W1(j,:)).^2));

end

end

mr=SED/kk;

 

Отбор оптимальной сети.

Необходимо построить карты самоорганизации с различной размерностью нейронного слоя. Для каждой из карт:

- задать размерность;

- задать параметры обучения;

- провести обучение на полученном массиве X;

- подсчитать количество кластеров, на которые разделены исходные 16 столбцов массива Х;

- рассчитать среднее межкластерное евклидово расстояние.

Этот алгоритм, с целью сокращения программы, реализуем в виде отдельного файла. Используем двумерную карту самоорганизации. Размеры нейронного слоя обозначим через a и b. В таблице приведены размерности карт.

A            
B            

 

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

Для отбора оптимальной сети необходимо построить график.

В системе Octave существует несколько способов построить два графика на одном рисунке, например использовать функцию plotyy. В этом случае масштабы по оси ординат будут независимы. Аргументы функции: plotyy(X1,Y1,X2,Y2), где массивы X1 и Y1 содержат координаты точки для построения первого графика, X2 и Y2 – второго. Пусть первый график – количество кластеров, второй – межкластерное расстояние. Так как X1 и X2 совпадают, то понадобится сформировать 3 массива:

1) Количество нейронов;

2) Количество кластеров;

3) Межкластерное расстояние.

Таким образом, описанные выше действия в программе можно отобразить так:

X(:,deli)=[]; #Удаление

X1=zeros(0,1); # количество нейронов

Y1=zeros(0,1); # количество кластеров

Y2=zeros(0,1); # межкластерное расстояние

for a=3:8

for b=a:a+1

[net,kk,mr]=foo(a,b,X);

X1=cat(1,X1,a*b); #Склейка количества нейронов

Y1=cat(1,Y1,kk); #Склейка количества кластеров

Y2=cat(1,Y2,mr); #Склейка межкластерного расстояния

end

end

plotyy(X1,Y1,X1,Y2); #Построение графика

 

Определить оптимальную сеть можно по графику:

Рисунок 1 – Графики зависимости количества кластеров и межкластерного расстояния от количества нейронов карты.

Здесь ось абсцисс – количество нейронов в сети, синяя линия – количество кластеров, зелёная – среднее межкластерное евклидово расстояние. Как видно, оптимальной является карта 7х7=49 нейронов, выделившая 13 кластеров.

Вывод: Используя функционал математического пакета Octave, мы подготовили набор данных, на которых решалась задача кластеризации. А также мы изучили и создали карты самоорганизации – карты Кохонена, с различной размерностью нейронного слоя. Итогом работы стало построение графика зависимости количества кластеров и межкластерного расстояния, с помощью которого мы определили оптимальную сеть. Можно сделать вывод, что оптимальной является двумерная карта Кохонена 7х7=49 нейронов, выделившая 13 кластеров.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: