net = newsom([0 2; 0 1], [2 3])
net.layers{l}
ans =
dimensions:[2 3]
distanceFcn:'linkdist'
distances:[6x6 double]
initFcn:'initwb'
netInputFcn:'netsum'
positions:[2x6 double]
size:6
topologyFcn:'hextop'
transferFcn:'compet'
userdata:[1x1 struct].
Из анализа характеристик этой сети следует, что она использует по умолчанию гексагональную топологию hextop и функцию расстояния linkdist.
Для обучения сети зададим следующие 12 двухэлементных векторов входа:
Р = [0.1 0.3 1.2 1.1 1.8 1.7 0.1 0.3 1.2 1.1 1.8 1.7; ...
0.2 0.1 0.3 0.1 0.3 0.2 1.8 1.8 1.9 1.9 1.7 1.8].
Построим на топографической карте начальное расположение нейронов карты Кохонена и вершины векторов входа (рисунок 3.11):
plotsom(net.iw{1,1}, net.layers{1}.distances)
hold on
plot(P(1,;),P(2,:), '*к','markersize',10)
Рисунок 3.11 – Начальное расположение нейронов
Векторы входа помечены символом * и расположены по периметру рисунка, а начальное расположение нейронов соответствует точке с координатами (1, 0.5).
3.2.5 Обучение сети
Обучение самоорганизующейся карты Кохонена реализуется повекторно независимо от того, выполняется обучение сети с помощью функции trainwbl или адаптация с помощью функции adaptwb. В любом случае функция learnsom выполняет настройку элементов весовых векторов нейронов.
Прежде всего определяется нейрон-победитель и корректируются его вектор весов и векторы весов соседних нейронов согласно соотношению:
, (3.13)где
- параметр скорости обучения; - массив параметров соседства для нейронов, расположенных в окрестности нейрона-победителя i, который вычисляется по соотношению: (3.14)где
- элемент выхода нейронной сети; - расстояние между нейронами i и j; - размер окрестности нейрона-победителя.Весовые векторы нейрона-победителя и соседних нейронов изменяются в зависимости от значения параметра соседства. Веса нейрона-победителя изменяются пропорционально параметру скорости обучения, а веса соседних нейронов - пропорционально половинному значению этого параметра.
Процесс обучения карты Кохонена включает 2 этапа: этап упорядочения векторов весовых коэффициентов в пространстве признаков и этап подстройки. При этом используются следующие параметры обучения сети (таблица 2.1):
Таблица 2.1
Параметры обучения сети
Параметры обучения и настройки карты Кохонена | Значение по умолчанию | ||
Количество циклов обучения | neе.trainParamepochs | N | >1000 |
Количество циклов на этапе упорядочения | netinputWeights{1,1}.learnParam.order_steps | S | 1000 |
Параметр скорости обучения на этапе упорядочения | net.inputWeights{1,1}.leamParam.order_lr | order_lr | 0.9 |
Параметр скорости обучения на этапе подстройки | net.inputWeights{1,1}.learnParam.tune_lr | tune | 0.02 |
Размер окрестности на этапе подстройки | net.inputWeights(1,1).learnParam.tune_nd | tune_nd | 1 |
В процессе построения карты Кохонена изменяются 2 параметра: размер окрестности и параметр скорости обучения.
Этап упорядочения. На этом этапе используется фиксированное количество шагов. Начальный размер окрестности назначается равным максимальному расстоянию между нейронами для выбранной топологии и затем уменьшается до величины, используемой на этапе подстройки в соответствии со следующим правилом:
, (3.15)где
- максимальное расстояние между нейронами; - номер текущего шага.Параметр скорости обучения изменяется по правилу:
. (3.16)Таким образом, он уменьшается от значения order_lr до значения tune_lr.
Этап подстройки. Этот этап продолжается в течение оставшейся части процедуры обучения. Размер окрестности на этом этапе остается постоянным и равным:
. (3.17)Параметр скорости обучения изменяется по следующему правилу:
. (3.18)Параметр скорости обучения продолжает уменьшаться, но очень медленно, и именно поэтому этот этап именуется подстройкой. Малое значение окрестности и медленное уменьшение параметра скорости обучения хорошо настраивают сеть при сохранении размещения, найденного на предыдущем этапе. Число шагов на этапе подстройки должно значительно превышать число шагов на этапе размещения. На этом этапе происходит тонкая настройка весов нейронов по отношению к набору векторов входа.
Как и в случае слоя Кохонена, нейроны карты Кохонена будут упорядочиваться так, чтобы при равномерной плотности векторов входа нейроны карты Кохонена также были распределены равномерно. Если векторы входа распределены неравномерно, то и нейроны на карте Кохонена будут иметь тенденцию распределяться в соответствии с плотностью размещения векторов входа.
Таким образом, при обучении карты Кохонена решается не только задача кластеризации входных векторов, но и выполняется частичная классификация.
Выполним обучение карты Кохонена размера 2x3 с гексагональной сеткой и с мерой, определяемой расстоянием связи:
net = newsom([0 2; 0 1], [2 3]).
Для обучения сети зададим 12 двухэлементных векторов входа
Р = [0.1 0.3 1.2 1.1 1.8 1.7 0.1 0.3 1.2 1.1 1.8 1.7; ...
0.2 0.1 0.3 0.1 0.3 0,2 1,8 1.8 1.9 1.9 1.7 1.8].
Зададим количество циклов обучения равным 2000:
net.trainParam.epochs = 2000
net.trainParam.show = 100
net = train (net, P)
plot(p(l,:),P(2,:), '*', 'markersize',10)
hold on
plotsom(net.iw{1*1},net.layers{l).distances).
Результат обучения представлен на рисунке 3.12.
Рисунок 3.12 – Карты Кохонена с гексагональной сеткой
Положение нейронов и их нумерация определяются массивом весовых векторов, который для данного примера имеет вид:
net.IW{l}
ans =
1.2163 0.20902
0.73242 0.46577
1.0645 0.99103
0.4551 1.3893
1.5359 1.8079
1.0888 1.8433.
Если промоделировать карту Кохонена на массиве обучающих векторов входа, то будет получен следующий выход сети:
а = sim(net,P)
а =
(2,1)1
(2,2)1
(1,3) 1
(1,4) 1
(1,5) 1
(1,6) 1
(4,7) 1
(4,8) 1
(6,9) 1(6.10) 1
(5.11) 1
(5.12) 1.
Это означает, что векторы входов 1 и 2 отнесены к кластеру с номером 2, векторы 3-6 - к кластеру 1, векторы 7-8 - к кластеру 4, векторы 9-10 - к кластеру 6, а векторы 11-12 - к кластеру 5. Номер кластера на рисунке соответствует номеру соответствующего нейрона на карте Кохонена.
Если сформировать произвольный вектор входа, то карта Кохонена должна указать его принадлежность к тому или иному кластеру:
а = sim(net,[1.5; 1])
а = (3,1) 1.
В данном случае представленный вектор входа отнесен к кластеру с номером 3. Обратите внимание, что векторов такого сорта в обучающей последовательности не было. Рассмотрим еще 2 модели одномерной и двумерной карт Кохонена.
3.2.6 Моделирование одномерной карты Кохонена
Рассмотрим 100 двухэлементных входных векторов единичной длины, распределенных равномерно в пределах от 0 до 90°:
angles = 0:0.5*pi/99:0.5*pi
Р = [sin(angles);cos(angles)]
plot(P(1,1:10:end), P(2,l:10:end), 'b')
holdon.
График входных векторов приведен на рисунке 3.13, а, и на нем символом * отмечено положение каждого 10-го вектора.
Рисунок 3.13 – График входных векторов
Сформируем самоорганизующуюся карту Кохонена в виде одномерного слоя из 10 нейронов и выполним обучение в течение 2000 циклов:
net = newsom( [0 1;0 1], [10])
net.trainParam.epochs = 2000; net.trainParam.show = 100
[net, tr] = train(net,P)
plotsom (net .IW{1,1}, net.layers{1}.distances) % (рисунок 3.13 ,a)
figure ( 2) a = sim(net,P); bar(sum(a1)) % (рисунок 3.13,б).
Весовые коэффициенты нейронов, определяющих центры кластеров, отмечены на рисунке 3.13, а цифрами. На рисунке 3.13, б показано распределение обучающих векторов по кластерам. Как и ожидалось, они распределены практически равномерно с разбросом от 8 до 12 векторов в кластере.
Таким образом, сеть подготовлена к кластеризации входных векторов. Определим, к какому кластеру будет отнесен вектор [1; 0]:
а = sim(net,[1;0])
а = (10,1)1.
Как и следовало ожидать, он отнесен к кластеру с номером 10.
3.2.7 Моделирование двумерной карты Кохонена
Этот пример демонстрирует обучение двумерной карты Кохонена. Сначала создадим обучающий набор случайных двумерных векторов, элементы которых распределены по равномерному закону в интервале [-1, 1]:
P = rands(2,1000)
plot(P(l,:),Р(2, :),'+') % (рисунок 3.14).
Рисунок 3.14 – Обучающий набор случайных двумерных векторов
Для кластеризации векторов входа создадим самоорганизующуюся карту Кохонена размера 5x6 с 30 нейронами, размещенными на гексагональной сетке:
net = newsom([-1 1; -1 1],[5,6])
net.trainParam.epochs = 1000
net.trainParam.show = 100
net = train(net,P); plotsom(net.IW{1,1},net.layers{l}.distances).
Результирующая карта после этапа размещения показана на рисунке 3.15, а. Продолжим обучение и зафиксируем карту после 1000 шагов этапа подстройки (рисунок 3.15, б), а затем после 4000 шагов (рисунок 3.15, в). Нетрудно убедиться, что нейроны карты весьма равномерно покрывают область векторов входа.
Рисунок 3.15 – Результирующая карта после этапа размещения