data2 = [1.7; 8.7];
a = sim(network1, data1)
a =
(3,1) 1
Возбужденный нейрон показывает номер класса. В нашем случае входной вектор data2 отнесен к третьему классу.
Создание и использование соперничающего слоя в командном окне
Зададим множество, состоящее из четырех двухэлементных векторов Р: P = [.2 .5 .1 .8; .3 .7 .2 .6]; % определение входного вектора Соперничающий слой должен разделить входы на два класса:
net = newc ([0 1; 0 1], 2); % создание соперничающего слоя
net = train (net, P); % обучение соперничающего слоя на векторе Р Результирующая сеть выдает выходной вектор, конвертируемый в номер
класса:
Y = sim (net, P) % имитация работы слоя Y =
(2,1)
|
1
|
(1,2)
|
1
|
(2,3)
|
1
|
(1,4)
|
1
|
Yc = vec2ind(Y) % конвертирование выхода сети в номер класса; Y состо- ит из векторов, содержащих только по одной единице. Функция vec2ind пока- зывает индексы единичных позиций.
Yc =
2 1 2 1
Пример решения задачи кластеризации векторов
Пусть заданы 30 случайных векторов, изображённых на графике снежин- ками (рисунок 7.10). Оцифровав данный график, можно получить массив вход-
ных данных
P(1,:), P(2,:)
(табл. 7.1).
6
4
2
0
-2
-4
-4 -2 0 2 4 6 8 10
P(1,:)
|
-1.2
|
-0.5
|
1.4
|
2.6
|
9.5
|
2.8
|
7.1
|
2.6
|
0.2
|
2.6
|
P(2,:)
|
3.3
|
2.6
|
2.6
|
2.7
|
1.6
|
-1.3
|
-0.6
|
-2.2
|
6.4
|
7.7
|
P(1,:)
|
-1.5
|
8.1
|
6.2
|
7.2
|
3.5
|
-0.8
|
3.4
|
1.6
|
8.3
|
5.0
|
P(2,:)
|
2.8
|
3.9
|
-0.2
|
0.9
|
2.8
|
4.6
|
7.5
|
3.2
|
-1.4
|
3.3
|
P(1,:)
|
6.7
|
1.7
|
-0.1
|
3.3
|
4.1
|
8.8
|
-2.6
|
8.3
|
4.2
|
8.2
|
P(2,:)
|
1.0
|
4.9
|
4.8
|
5.4
|
1.3
|
1.5
|
3.7
|
-1.3
|
-1.4
|
1.9
|
Рисунок 7.10. Распределение входных векторов Таблица 7.1. Массив входных данных
Следующий алгоритм демонстрирует процедуру обучения самоорганизу- ющейся нейронной сети Кохонена.
plot(P(1,:), P(2,:), '*g');
title('Input vectors'); xlabel('P(1,:)');
ylabel('P(2,:)'); hold on; nclusters = 6;
a1 = -3;
a2 = 10;
b1 = -3;
b2 = 9;
net = newc([a1 a2; b1 b2], nclusters, 0.1, 0.0005); wo = net.IW{1};
bo = net.b{1}; net.trainParam.epochs=100; net.trainParam.show=20; net = train(net,P);
w = net.IW{1};
bn = net.b{1}; plot(w(:,1),w(:,2),'kp');
На рисунке 7.11 представлены исходные данные (снежинки) и полученные центры кластеризации (звёзды).
Input vectors
6
4
P(2,:)
2
0
-2
-4
-4 -2 0 2 4 6 8 10
P(1,:)
Рисунок 7.11. Распределение входных данных (крестики) и положение центров кластериза- ции (звёздочки)
Применение SOM для кластеризации векторов
Рассмотрим работу SOM на примере задачи кластеризации 1000 двухэле- ментных векторов, расположенных в ограниченной прямоугольной области (Рисунок 7.12).
P = rands(2, 1000); % определение множества векторов для кластеризации
plot(P(1,:), P(2,:), '*g') % изображение множества векторов
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-1 -0.8
-0.6 -0.4
-0.2 0 0.2
0.4 0.6 0.8 1
Рисунок 7.12. Множество исходных векторов для кластеризации
net = newsom ([0 1; 0 1], [5 6]); % создание SOM размерностью 5x6. Используем сеть размерностью 5x6, чтобы классифицировать вышеопре-
деленные векторы. Создадим сеть с 30 центрами, к которым сеть будет отно- сить каждый вектор на основе ближайшего соседства.
plotsom(net. iw{ 1,1}, net.layers{1}.distances); % визуализация SOM Сначала центр прямоугольника совпадает с центрами классов. Обучим
сеть на 100 эпохах и изобразим результат: net.trainParam.epochs = 100; % установка количества эпох net = train(net, P) % обучение сети
Во время обучения появляется панель инструментов (рисунок 7.13).
Есть несколько полезных визуализаций, доступ к которым можно полу- чить из этого окна. При нажатии SOM Weight Positions, появляется фигура (ри- сунок 7.14), которая показывающая расположение точек данных и весовых век- торов. Как показано на рисунке, только после 100 итераций алгоритма, веса си- напсов настроились таким образом, чтобы узлы решетки «располагались» в ме- стах локальных сгущений данных, то есть описывали кластерную структуру облака данных.
Рисунок 7.13. Окно обучения нейронной сети
Рисунок 7.14. Расположение точек данных и весовых векторов
При высокой размерности входа, нельзя одновременно визуализировать все веса. В этом случае, можно нажать SOM Neighbor Distances (рисунок 7.15).
Здесь используется следующее кодирование цвета: синие шестиугольни- ки представляют собой нейроны. Красные линии соединяют соседние нейроны. Цвета в областях, содержащих красные линии указывают расстояния между нейронами. Более темные цвета представляют большие расстояния. Чем свет- лее цвета, тем меньше расстояния. Сравнивая рисунки 7.15 и 7.15, убеждаемся в их идентичности.
Рисунок 7.15. Сила взаимодействия (веса нейронов) соседних нейронов в карте Кохонена
Нажав SOM Sample Hits можно увидеть количество точек данных, связан- ных с каждым нейроном (рисунок 7.16). Лучше всего, если данные достаточно равномерно распределены между нейронами. В этом примере, данные менее связанны с центральными нейронами, но в целом распределение удовлетвори- тельное.
Рисунок 7.16. Количество точек данных, связанных с каждым нейроном
Визуализацию весов, соединяющих каждый вход с каждым из нейронов, можно увидеть нажав SOM Weight Planes (рисунок 7.17). Здесь темные цвета представляют большие веса. Если схемы соединения из двух входов очень по- хожи, можно предположить, что входы высоко коррелированны. В нашем слу- чае вход 1 имеет связи, которые очень отличаются от входа 2.
Рисунок 7.17. Визуализация весов, соединяющих каждый вход с каждым из нейронов
Достарыңызбен бөлісу: |