Главная страница |
Культура Искусство Языки Языкознание Вычислительная техника Информатика Финансы Экономика Биология Сельское хозяйство Психология Ветеринария Медицина Юриспруденция Право Физика История Экология Промышленность Энергетика Этика Связь Автоматика Математика Электротехника Философия Религия Логика Химия Социология Политология Геология |
Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6. В. Г. Потемкин
7.1.1. Слой КохоненаРассмотрим самоорганизующуюся нейронную сеть с единственным слоем, задача которой заключается в том, чтобы правильно сгруппировать (кластеризировать) поступающие на нее векторы входа. Архитектура сетиАрхитектура слоя Кохонена показана на рис. 7.1. Рис. 7.1 Нетрудно убедиться, что это слой конкурирующего типа, поскольку в нем применена конкурирующая функция активации. Кроме того, архитектура этого слоя очень напоминает архитектуру скрытого слоя радиальной базисной сети. Здесь использован блок ndist для вычисления отрицательного евклидова расстояния между вектором входа p и строками матрицы весов IW11. Вход функции активации n1 – это результат суммирования вычисленного расстояния с вектором смещения b. Если все смещения нулевые, максимальное значение n1 не может превышать 0. Нулевое значение n1 возможно только, когда вектор входа p оказывается равным вектору веса одного из нейронов. Если смещения отличны от 0, то возможны и положительные значения для элементов вектора n1. Конкурирующая функция активации анализирует значения элементов вектора n1 и формирует выходы нейронов, равные 0 для всех нейронов, кроме одного нейрона – победителя, имеющего на входе максимальное значение. Таким образом, вектор выхода слоя a1 имеет единственный элемент, равный 1, который соответствует нейрону-победителю, а остальные равны 0. Такая активационная характеристика может быть описана следующим образом: (7.1) Заметим, что эта активационная характеристика устанавливается не на отдельный нейрон, а на слой. Поэтому такая активационная характеристика и получила название конкурирующей. Номер активного нейрона i* определяет ту группу (кластер), к которой наиболее близок входной вектор. Создание сетиДля формирования слоя Кохонена предназначена М-функция newc. Покажем, как она работает, на простом примере. Предположим, что задан массив из четырех двухэлементных векторов, которые надо разделить на 2 класса: p = [.1 .8 .1 .9; .2 .9 .1 .8] p = 0.1000 0.8000 0.1000 0.9000 0.2000 0.9000 0.1000 0.8000 В этом примере нетрудно видеть, что 2 вектора расположены вблизи точки (0,0) и 2 вектора – вблизи точки (1, 1). Сформируем слой Кохонена с двумя нейронами для анализа двухэлементных векторов входа с диапазоном значений от 0 до 1: net = newc([0 1; 0 1],2); Первый аргумент указывает диапазон входных значений, второй определяет количество нейронов в слое. Начальные значения элементов матрицы весов задаются как среднее максимального и минимального значений, т. е. в центре интервала входных значений; это реализуется по умолчанию с помощью М-функции midpoint при создании сети. Убедимся, что это действительно так: wts = net.IW{1,1} wts = 0.5000 0.5000 0.5000 0.5000 Определим характеристики слоя Кохонена: net.layers{1} ans = dimensions: 2 distanceFcn: 'dist' distances: [22 double] initFcn: 'initwb' netInputFcn: 'netsum' positions: [0 1] size: 2 topologyFcn: 'hextop' transferFcn: 'compet' userdata: [11 struct] Из этого описания следует, что сеть использует функцию евклидова расстояния dist, функцию инициализации initwb, функцию обработки входов netsum, функцию активации compet и функцию описания топологии hextop. Характеристики смещений следующие: net.biases{1} ans = initFcn: 'initcon' learn: 1 learnFcn: 'learncon' learnParam: [11 struct] size: 2 userdata: [11 struct] Смещения задаются функцией initcon и для инициализированной сети равны net.b{1} ans = 5.4366 5.4366 Функцией настройки смещений является функция learncon, обеспечивающая настройку с учетом параметра активности нейронов. Элементы структурной схемы слоя Кохонена показаны на рис. 7.2, а-б и могут быть получены с помощью оператора gensim(net) Они наглядно поясняют архитектуру и функции, используемые при построении слоя Кохонена.
Рис. 7.2 Теперь, когда сформирована самоорганизующаяся нейронная сеть, требуется обучить ее решению задачи кластеризации данных. Напомним, что каждый нейрон блока compet конкурирует за право ответить на вектор входа p. Если все смещения равны 0, то нейрон с вектором веса, самым близким к вектору входа p, выигрывает конкуренцию и возвращает на выходе значение 1; все другие нейроны возвращают значение 0. Правило обучения слоя КохоненаПравило обучения слоя Кохонена, называемое также правилом Кохонена, заключается в том, чтобы настроить нужным образом элементы матрицы весов. Предположим, что нейрон i победил при подаче входа p(q) на шаге самообучения q, тогда строка i матрицы весов корректируется в соответствии с правилом Кохонена следующим образом: (7.2) Правило Кохонена представляет собой рекуррентное соотношение, которое обеспечивает коррекцию строки i матрицы весов добавлением взвешенной разности вектора входа и значения строки на предыдущем шаге. Таким образом, вектор веса, наиболее близкий к вектору входа, модифицируется так, чтобы расстояние между ними стало еще меньше. Результат такого обучения будет заключаться в том, что победивший нейрон, вероятно, выиграет конкуренцию и в том случае, когда будет представлен новый входной вектор, близкий к предыдущему, и его победа менее вероятна, когда будет представлен вектор, существенно отличающийся от предыдущего. Когда на вход сети поступает все большее и большее число векторов, нейрон, являющийся ближайшим, снова корректирует свой весовой вектор. В конечном счете, если в слое имеется достаточное количество нейронов, то каждая группа близких векторов окажется связанной с одним из нейронов слоя. В этом и заключается свойство самоорганизации слоя Кохонена. Настройка параметров сети по правилу Кохонена реализована в виде М-функции learnk. Правило настройки смещенийОдно из ограничений всякого конкурирующего слоя состоит в том, что некоторые нейроны оказываются незадействованными. Это проявляется в том, что нейроны, имеющие начальные весовые векторы, значительно удаленные от векторов входа, никогда не выигрывают конкуренции, независимо от того как долго продолжается обучение. В результате оказывается, что такие векторы не используются при обучении и соответствующие нейроны никогда не оказываются победителями. Такие нейроны-неудачники называют "мертвыми" нейронами, поскольку они не выполняют никакой полезной функции. Чтобы исключить такую ситуацию и сделать нейроны чувствительными к поступающим на вход векторам, используются смещения, которые позволяют нейрону стать конкурентным с нейронами-победителями. Этому способствует положительное смещение, которое добавляется к отрицательному расстоянию удаленного нейрона. Соответствующее правило настройки, учитывающее нечувствительность мертвых нейронов, реализовано в виде М-функции learncon и заключается в следующем. В начале процедуры настройки всем нейронам конкурирующего слоя присваивается одинаковый параметр активности , (7.3) где N – количество нейронов конкурирующего слоя, равное числу кластеров. В процессе настройки М-функция learncon корректирует этот параметр таким образом, чтобы его значения для активных нейронов становились больше, а для неактивных нейронов меньше. Соответствующая формула для вектора приращений параметров активности выглядит следующим образом: , (7.4) где lr – параметр скорости настройки; – вектор, элемент i* которого равен 1, а остальные – 0. Нетрудно убедиться, что для всех нейронов, кроме нейрона-победителя, приращения отрицательны. Поскольку параметры активности связаны со смещениями соотношением (в обозначениях системы MATLAB) , (7.5) то из этого следует, что смещение для нейрона-победителя уменьшится, а смещения для остальных нейронов немного увеличатся. М-функция learncon использует следующую формулу для расчета приращений вектора смещений . (7.6) Параметр скорости настройки lr по умолчанию равен 0.001, и его величина обычно на порядок меньше соответствующего значения для М-функции learnk. Увеличение смещений для неактивных нейронов позволяет расширить диапазон покрытия входных значений, и неактивный нейрон начинает формировать кластер. В конечном счете он может начать притягивать новые входные векторы. Это дает два преимущества. Если нейрон не выигрывает конкуренции, потому что его вектор весов существенно отличается от векторов, поступающих на вход сети, то его смещение по мере обучения становится достаточно большим и он становится конкурентоспособным. Когда это происходит, его вектор весов начинает приближаться к некоторой группе векторов входа. Как только нейрон начинает побеждать, его смещение начинает уменьшаться. Таким образом, задача активизации "мертвых" нейронов оказывается решенной. Второе преимущество, связанное с настройкой смещений, состоит в том, что они позволяют выравнять значения параметра активности и обеспечить притяжение приблизительно одинакового количества векторов входа. Таким образом, если один из кластеров притягивает большее число векторов входа, чем другой, то более заполненная область притянет дополнительное количество нейронов и будет поделена на меньшие по размерам кластеры. Обучение сетиРеализуем 10 циклов обучения. Для этого можно использовать функции train или adapt: net.trainParam.epochs = 10; net = train(net,p); net.adaptParam.passes = 10; [net,y,e] = adapt(net,mat2cell(p)); Заметим, что для сетей с конкурирующим слоем по умолчанию используется обучающая функция trainwb1, которая на каждом цикле обучения случайно выбирает входной вектор и предъявляет его сети; после этого производится коррекция весов и смещений. Выполним моделирование сети после обучения: a = sim(net,p); ac = vec2ind(a) ac = 2 1 2 1 Видим, что сеть обучена классификации векторов входа на 2 кластера: первый расположен в окрестности вектора (0, 0), второй – в окрестности вектора (1, 1). Результирующие веса и смещения равны: wts1 = net.IW{1,1} b1 = net.b{1} wts1 = 0.58383 0.58307 0.41712 0.42789 b1 = 5.4152 5.4581 Заметим, что первая строка весовой матрицы действительно близка к вектору (1, 1), в то время как вторая строка близка к началу координат. Таким образом, сформированная сеть обучена классификации входов. В процессе обучения каждый нейрон в слое, весовой вектор которого близок к группе векторов входа, становится определяющим для этой группы векторов. В конечном счете, если имеется достаточное число нейронов, каждая группа векторов входа будет иметь нейрон, который выводит 1, когда представлен вектор этой группы, и 0 в противном случае, или, иными словами, формируется кластер. Таким образом, слой Кохонена действительно решает задачу кластеризации векторов входа. Пример: Функционирование слоя Кохонена можно пояснить более наглядно, используя графику системы MATLAB. Рассмотрим 48 случайных векторов на плоскости, формирующих 8 кластеров, группирующихся около своих центров. На графике, приведенном на рис. 7.3, показано 48 двухэлементных векторов входа. Сформируем координаты случайных точек и построим план их расположения на плоскости: c = 8; n = 6; % Число кластеров, векторов в кластере d = 0.5; % Среднеквадратичное отклонение от центра кластера x = [–10 10;–5 5]; % Диапазон входных значений [r,q] = size(x); minv = min(x')'; maxv = max(x')'; v = rand(r,c).*((maxv – minv)*ones(1,c) + minv*ones(1,c)); t = c*n; % Число точек v = [v v v v v v]; v=v+randn(r,t)*d; % Координаты точек P = v; plot(P(1,:), P(2,:),'+k') % Рис.7.3 title(' Векторы входа'), xlabel('P(1,:)'), ylabel('P(2,:)') Векторы входа, показанные на рис. 7.3, относятся к различным классам. Рис. 7.3 Применим конкурирующую сеть из восьми нейронов для того, чтобы распределить их по классам: net = newc([–2 12;–1 6], 8 ,0.1); w0 = net.IW{1} b0 = net.b{1} c0 = exp(1)./b0 Начальные значения весов, смещений и параметров активности нейронов представлены в следующей таблице:
После обучения в течение 500 циклов получим: net.trainParam.epochs = 500; net = train(net,P); w = net.IW{1} bn = net.b{1} cn = exp(1)./bn
Как следует из приведенных таблиц, центры кластеризации распределились по восьми областям, показанным на рис. 7.4, а; смещения отклонились в обе стороны от исходного значения 21.746 так же, как и параметры активности нейронов, показанные на рис. 7.4, б.
Рис. 7.4 Рассмотренная самонастраивающаяся сеть Кохонена является типичным примером сети, которая реализует процедуру обучения без учителя. Демонстрационный пример democ1 также поясняет процедуру обучения самоорганизующейся сети. 7.1.2. Карта КохоненаСамоорганизующаяся сеть в виде карты Кохонена предназначена для решения задач кластеризации входных векторов. В отличие от слоя Кохонена карта Кохонена поддерживает такое топологическое свойство, когда близким кластерам входных векторов соответствуют близко расположенные нейроны. Первоначальная топология размещения нейронов в слое Кохонена задается М-функциями gridtop, hextop или randtop, что соответствует размещению нейронов в узлах либо прямоугольной, либо гексагональной сетки, либо в узлах сетки со случайной топологией. Расстояния между нейронами вычисляются с помощью специальных функций вычисления расстояний dist, boxdist, linkdist и mandist. Карта Кохонена для определения нейрона-победителя использует ту же процедуру, какая применяется и в слое Кохонена. Однако на карте Кохонена одновременно изменяются весовые коэффициенты соседних нейронов в соответствии со следующим соотношением, именуемым правилом Кохонена: (7.7) В этом случае окрестность нейрона-победителя включает все нейроны, которые находятся в пределах некоторого радиуса d: (7.8) Чтобы пояснить понятие окрестности нейрона, обратимся к рис. 7.5. Рис. 7.5 Левая часть рисунка соответствует окрестности радиуса 1 для нейрона-победителя с номером 13; правая часть – окрестности радиуса 2 для того же нейрона. Описания этих окрестностей выглядят следующим образом: (7.9) Заметим, что топология карты расположения нейронов не обязательно должна быть двумерной. Это могут быть и одномерные и трехмерные карты, и даже карты больших размерностей. В случае одномерной карты Кохонена, когда нейроны расположены вдоль линии, каждый нейрон будет иметь только двух соседей в пределах радиуса 1 или единственного соседа, если нейрон расположен на конце линии. Расстояния между нейронами можно определять различными способами, используя прямоугольные или гексагональные сетки, однако это никак не влияет на характеристики сети, связанные с классификацией входных векторов. Топология картыКак уже отмечалось выше, можно задать различные топологии для карты расположения нейронов, используя М-функции gridtop, hextop, randtop. Рассмотрим простейшую прямоугольную сетку размера 23 для размещения шести нейронов, которая может быть сформирована с помощью функции gridtop: pos = gridtop(2,3) pos = 0 1 0 1 0 1 0 0 1 1 2 2 plotsom(pos) % Рис.7.6 Соответствующая сетка показана на рис. 7.6. Метки position(1, i) и position(2, i) вдоль координатных осей генерируются функцией plotsom и задают позиции расположения нейронов по первой, второй и т. д. размерностям карты. Рис. 7.6 Здесь нейрон 1 расположен в точке с координатами (0,0), нейрон 2 – в точке (1,0), нейрон 3 – в точке (0,1) и т. д. Заметим, что, если применить команду gridtop, переставив аргументы местами, получим иное размещение нейронов: pos = gridtop(3,2) pos = 0 1 2 0 1 2 0 0 0 1 1 1 Гексагональную сетку можно сформировать с помощью функции hextop: pos = hextop(2,3) pos = 0 1.0000 0.5000 1.5000 0 1.0000 0 0 0.8660 0.8660 1.7321 1.7321 plotsom(pos) % Рис.7.7 Рис. 7.7 Заметим, что М-функция hextop используется по умолчанию при создании карт Кохонена при применении функции newsom. Сетка со случайным расположением узлов может быть создана с помощью функции randtop: pos = randtop(2,3) pos = 0.061787 0.64701 0.40855 0.94983 0 0.65113 0 0.12233 0.90438 0.54745 1.4015 1.5682 plotsom(pos) % Рис.7.8 Рис. 7.8 Функции для расчета расстоянийВ ППП NNT используется 4 функции для расчета расстояний между узлами сетки. Функция dist вычисляет евклидово расстояние между нейронами, размещенными в узлах сетки, в соответствии с формулой , (7.10) где posi, posj – векторы положения нейронов с номерами i и j. Обратимся к прямоугольной сетке из шести нейронов (см. рис. 7.6) и вычислим соответствующий массив расстояний: pos = gridtop(2,3); d = dist(pos) d = 0 1 1 1.4142 2 2.2361 1 0 1.4142 1 2.2361 2 1 1.4142 0 1 1 1.4142 1.4142 1 1 0 1.4142 1 2 2.2361 1 1.4142 0 1 2.2361 2 1.4142 1 1 0 Этот массив размера 66 описывает расстояния между нейронами и содержит на диагонали нули, поскольку они определяют расстояние нейрона до самого себя, а затем, двигаясь вдоль строки, – до второго, третьего и т. д. На рис. 7.9 показано расположение нейронов в узлах прямоугольной сетки. Введем понятие окрестности для прямоугольной сетки. В этом случае окрестность размера 1, или просто окрестность 1, включает базовый нейрон и его непосредственных соседей; окрестность 2 включает нейроны из окрестности 1 и их соседей. Рис. 7.9 Размер, а соответственно и номер окрестности, определяется максимальным значением координаты смещения нейрона от базового. Вводимое таким способом расстояние между нейронами называется расстоянием максимального координатного смещения и может быть вычислено по формуле (7.11) где posi, posj – векторы положения нейронов с номерами i и j. Для вычисления этого расстояния в ППП NNT предназначениа М-функция boxdist. Для конфигурации нейронов, показанной на рис. 7.6, эти расстояния равны: pos = gridtop(2,3); d = boxdist(pos) d = 0 1 1 1 2 2 1 0 1 1 2 2 1 1 0 1 1 1 1 1 1 0 1 1 2 2 1 1 0 1 2 2 1 1 1 0 Расстояние максимального координатного смещения между базовым нейроном 1 и нейронами 2, 3 и 4 равно 1, поскольку они находятся в окрестности 1, а расстояние между базовым нейроном и нейронами 5 и 6 равно 2, и они находятся в окрестности 2. Расстояние максимального координатного смещения от нейронов 3 и 4 до всех других нейронов равно 1. Определим другое расстояние между нейронами, которое учитывает то количество связей, которое необходимо установить, чтобы задать путь движения от базового нейрона. Если задано S нейронов, положение которых определяется векторами pi, i= 1, …, S, то расстояние связи между ними определяется соотношением (7.12) Если евклидово расстояние между нейронами меньше или равно 1, то расстояние связи принимается равным 1; если между нейронами с номерами i и j имеется единственный промежуточный нейрон с номером k, то расстояние связи равно 2, и т. д. Для вычисления расстояния связи в ППП NNT предназначена функции linkdist. Для конфигурации нейронов, показанной на рис. 7.6, эти расстояния равны: pos = gridtop(2,3); d = linkdist(pos) d = 0 1 1 2 2 3 1 0 2 1 3 2 1 2 0 1 1 2 2 1 1 0 2 1 2 3 1 2 0 1 3 2 2 1 1 0 Расстояние связи между базовым нейроном 1 и нейронами 2, 3 равно 1, между базовым нейроном и нейронами 4 и 5 равно 2, между базовым нейроном и нейроном 6 равно 3. Наконец, определим расстояние максимального координатного смещения по формуле , (7.13) где posi, posj – векторы расположения нейронов с номерами i и j. Для вычисления расстояния максимального координатного смещения в ППП NNT предназначена функции mandist. Вновь обратимся к конфигурации нейронов на рис. 7.6: pos = gridtop(2,3); d = mandist(pos) d = 0 1 1 2 2 3 1 0 2 1 3 2 1 2 0 1 1 2 2 1 1 0 2 1 2 3 1 2 0 1 3 2 2 1 1 0 В случае прямоугольной сетки оно совпадает с расстоянием связи. Архитектура сетиАрхитектура самоорганизующейся карты Кохонена показана на рис. 7.10. Рис. 7.10 Эта архитектура аналогична структуре слоя Кохонена за исключением того, что здесь не используются смещения. Конкурирующая функция активации возвращает 1 для элемента выхода a1, соответствующего победившему нейрону; все другие элементы вектора a1 равны 0. Однако в сети Кохонена выполняется перераспределение нейронов, соседствующих с победившим нейроном. При этом можно выбирать различные топологии размещения нейронов и различные меры для вычисления расстояний между нейронами. Создание сетиДля создания самоорганизующейся карты Кохонена в составе ППП NNT предусмотрена М-функция newsom. Допустим, что требуется создать сеть для обработки двухэлементных векторов входа с диапазоном изменения элементов от 0 до 2 и от 0 до 1 соответственно. Предполагается использовать гексагональную сетку размера 23. Тогда для формирования такой нейронной сети достаточно воспользоваться оператором net = newsom([0 2; 0 1], [2 3]); net.layers{1} ans = dimensions: [2 3] distanceFcn: 'linkdist' distances: [66 double] initFcn: 'initwb' netInputFcn: 'netsum' positions: [26 double] size: 6 topologyFcn: 'hextop' transferFcn: 'compet' userdata: [11 struct] Из анализа характеристик этой сети следует, что она использует по умолчанию гексагональную топологию hextop и функцию расстояния linkdist. Для обучения сети зададим следующие 12 двухэлементных векторов входа: P = [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]; Построим на топографической карте начальное расположение нейронов карты Кохонена и вершины векторов входа (рис. 7.11): plotsom(net.iw{1,1},net.layers{1}.distances) hold on plot(P(1,:),P(2,:),'*k','markersize',10) Рис. 7.11 Векторы входа помечены символом * и расположены по периметру рисунка, а начальное расположение нейронов соответствует точке с координатами (1, 0.5). Обучение сетиОбучение самоорганизующейся карты Кохонена реализуется повекторно независимо от того, выполняется обучение сети с помощью функции trainwb1 или адаптация с помощью функции adaptwb. В любом случае функция learnsom выполняет настройку элементов весовых векторов нейронов. Прежде всего определяется нейрон-победитель и корректируются его вектор весов и векторы весов соседних нейронов согласно соотношению , (7.14) где lr – параметр скорости обучения; А2 – массив параметров соседства для нейронов, расположенных в окрестности нейрона-победителя i, который вычисляется по соотношению (7.15) где a(i, q) – элемент выхода нейронной сети; D(i, j) – расстояние между нейронами i и j; nd – размер окрестности нейрона-победителя. В соответствии с соотношениями (6.14) и (6.15) весовые векторы нейрона-победителя и соседних нейронов изменяются в зависимости от значения параметра соседства. Веса нейрона-победителя изменяются пропорционально параметру скорости обучения, а веса соседних нейронов – пропорционально половинному значению этого параметра. Процесс обучения карты Кохонена включает 2 этапа: этап упорядочения векторов весовых коэффициентов в пространстве признаков и этап подстройки. При этом используются следующие параметры обучения сети:
В процессе построения карты Кохонена изменяются 2 параметра: размер окрестности и параметр скорости обучения. Этап упорядочения. На этом этапе используется фиксированное количество шагов. Начальный размер окрестности назначается равным максимальному расстоянию между нейронами для выбранной топологии и затем уменьшается до величины, используемой на этапе подстройки в соответствии со следующим правилом: , (7.16) где max(d) – максимальное расстояние между нейронами; s – номер текущего шага. Параметр скорости обучения изменяется по правилу . (7.17) Таким образом, он уменьшается от значения order_lr до значения tune_lr. Этап подстройки. Этот этап продолжается в течение оставшейся части процедуры обучения. Размер окрестности на этом этапе остается постоянным и равным . (7.18) Параметр скорости обучения изменяется по следующему правилу: . (7.19) Параметр скорости обучения продолжает уменьшаться, но очень медленно, и именно поэтому этот этап именуется подстройкой. Малое значение окрестности и медленное уменьшение параметра скорости обучения хорошо настраивают сеть при сохранении размещения, найденного на предыдущем этапе. Число шагов на этапе подстройки должно значительно превышать число шагов на этапе размещения. На этом этапе происходит тонкая настройка весов нейронов по отношению к набору векторов входа. Как и в случае слоя Кохонена, нейроны карты Кохонена будут упорядочиваться так, чтобы при равномерной плотности векторов входа нейроны карты Кохонена также были распределены равномерно. Если векторы входа распределены неравномерно, то и нейроны на карте Кохонена будут иметь тенденцию распределяться в соответствии с плотностью размещения векторов входа. Таким образом, при обучении карты Кохонена решается не только задача кластеризации входных векторов, но и выполняется частичная классификация. Выполним обучение карты Кохонена размера 23 с гексагональной сеткой и с мерой, определяемой расстоянием связи net = newsom([0 2; 0 1], [2 3]); Для обучения сети зададим 12 двухэлементных векторов входа P = [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(1,:),P(2,:),'*','markersize',10) hold on plotsom(net.iw{1,1},net.layers{1}.distances) Результат обучения представлен на рис. 7.12. Рис. 7.12 Положение нейронов и их нумерация определяются массивом весовых векторов, который для данного примера имеет вид: net.IW{1} ans = 1.2163 0.20902 0.73242 0.46577 1.0645 0.99109 0.4551 1.3893 1.5359 1.8079 1.0888 1.8433 Если промоделировать карту Кохонена на массиве обучающих векторов входа, то будет получен следующий выход сети: a = sim(net,P) a = (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. Номер кластера на рисунке соответствует номеру соответствующего нейрона на карте Кохонена. Если сформировать произвольный вектор входа, то карта Кохонена должна указать его принадлежность к тому или иному кластеру: a = sim(net,[1.5; 1]) a = (3,1) 1 В данном случае представленный вектор входа отнесен к кластеру с номером 3. Обратите внимание, что векторов такого сорта в обучающей последовательности не было. Рассмотрим еще 2 примера одномерной и двумерной карт Кохонена. Одномерная карта КохоненаРассмотрим 100 двухэлементных входных векторов единичной длины, распределенных равномерно в пределах от 0 до 90°: angles = 0:0.5*pi/99:0.5*pi; P = [sin(angles); cos(angles)]; plot(P(1,1:10:end), P(2,1:10:end),'*b'), hold on График входных векторов приведен на рис. 7.13, а, и на нем символом * отмечено положение каждого 10-го вектора.
Рис. 7.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) % Рис.7.13,а figure(2) a = sim(net,P); bar(sum(a')) % Рис.7.13,б Весовые коэффициенты нейронов, определяющих центры кластеров, отмечены на рис. 7.13, а цифрами. На рис. 7.13, б показано распределение обучающих векторов по кластерам. Как и ожидалось, они распределены практически равномерно с разбросом от 8 до 12 векторов в кластере. Таким образом, сеть подготовлена к кластеризации входных векторов. Определим, к какому кластеру будет отнесен вектор [1; 0]: a = sim(net,[1;0]) a = (10,1) 1 Как и следовало ожидать, он отнесен к кластеру с номером 10. Двумерная карта КохоненаЭтот пример демонстрирует обучение двумерной карты Кохонена. Сначала создадим обучающий набор случайных двумерных векторов, элементы которых распределены по равномерному закону в интервале [–1 1]: P = rands(2,1000); plot(P(1,:),P(2,:),'+') % Рис.7.14 Рис. 7.14 Для кластеризации векторов входа создадим самоорганизующуюся карту Кохонена размера 56 с 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{1}.distances) Результирующая карта после этапа размещения показана на рис. 7.15, а. Продолжим обучение и зафиксируем карту после 1000 шагов этапа подстройки (рис. 7.15, б), а затем после 4000 шагов (рис. 7.15, в). Нетрудно убедиться, что нейроны карты весьма равномерно покрывают область векторов входа.
Рис. 7.15 Определим принадлежность нового вектора к одному из кластеров карты Кохонена и построим соответствующую вершину вектора на рис. 7.15, в: a = sim(net,[0.5;0.3]) a = (19,1) 1 hold on, plot(0.5,0.3,'*k') % Рис.7.15,в Нетрудно убедиться, что вектор отнесен к 19-му кластеру. Промоделируем обученную карту Кохонена, используя массив векторов входа: a = sim(net,P); bar(sum(a')) % Рис.7.16 Из анализа рис. 7.16 следует, что количество векторов входной последовательности, отнесенных к определенному кластеру, колеблется от 13 до 50. Рис. 7.16 Таким образом, в процессе обучения двумерная самоорганизующаяся карта Кохонена выполнила кластеризацию массива векторов входа. Следует отметить, что на этапе размещения было выполнено лишь 20 % от общего числа шагов обучения, т. е. 80 % общего времени обучения связано с тонкой подстройкой весовых векторов. Фактически на этом этапе выполняется в определенной степени классификация входных векторов. Слой нейронов карты Кохонена можно представлять в виде гибкой сетки, которая натянута на пространство входных векторов. В процессе обучения карты, в отличие от обучения слоя Кохонена, участвуют соседи нейрона-победителя, и, таким образом, топологическая карта выглядит более упорядоченной, чем области кластеризации слоя Кохонена. Читатель может продолжить изучение самоорганизующихся сетей, обратившись к демонстрационным программам demosm1 и demosm2. |