Обучение сети

Реализуем 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

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

w0 = 0.5 0.25 0.5 0.25 0.5 0.25 0.5 0.25 0.5 0.25 0.5 0.25 0.5 0.25 0.5 0.25 b0 = 21.746 21.746 21.746 21.746 21.746 21.746 21.746 21.746 c0 = 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125

После обучения в течение 500 циклов получим:

net.trainParam.epochs = 500;

net = train(net,P);

w = net.IW{1}

bn = net.b{1}

cn = exp(1)./bn

w = 6.2184 2.4239 1.3277 0.94701 0.31139 0.40935 3.543 4.5845 3.4617 2.8996 4.3171 1.4278 6.7065 0.43696 0.97817 0.17242 bn = 22.137 21.718 21.192 21.472 21.957 21.185 23.006 21.42 cn = 0.123 0.125 0.128 0.127 0.124 0.128 0.118 0.127

Как следует из приведенных таблиц, центры кластеризации распределились по восьми областям, показанным на рис. 7.4, а; смещения отклонились в обе стороны от исходного значения 21.746 так же, как и параметры активности нейронов, показанные на рис. 7.4, б.

а б

Рис. 7.4

Рассмотренная самонастраивающаяся сеть Кохонена является типичным примером сети, которая реализует процедуру обучения без учителя.

Демонстрационный пример democ1 также поясняет процедуру обучения самоорга­ни­­зую­щейся сети.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: