Чтобы сократить текст 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 кластеров.