Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Лабораторная работа № 13



Исследование самоорганизующихся
LVQ-сетей

Цель работы: изучение архитектуры самоорганизующихся нейронных сетей типа LVQ и специальных функций для их создания, настройки весов и обучения; ознакомление с демонстрационными примерами и их скриптами, а также приобретение навыков построения таких сетей для решения задач классификации входных векторов.

Теоретические сведения

Самоорганизующиеся нейронные сети типа LVQ (Learning
Vector Quantization), или сети для классификации входных векторов, состоят из двух слоёв без смещения. Входной слой является конкурирующим и используется для кластеризации векторов. Выходной слой является линейным с передаточной функцией purelin и обеспечивает соотнесение кластеров с целевыми классами, заданными пользователем. На каждый кластер во входном слое должен быть задан один нейрон, причём количество классов не должно быть больше количества кластеров.

Поскольку заранее известно, как кластеры первого слоя соотносятся с целевыми классами второго слоя, то это позволяет заранее задать элементы матрицы весов LW второго слоя. Однако чтобы найти правильный кластер для каждого вектора обучающего множества, необходимо выполнить процедуру обучения сети.

Для создания LVQ-сетей используется функция newlog, обращение к которой имеет следующий вид:

net = newlvg(PR, S1, PC, LR, LF),

где PR – массив размером Rх2 минимальных и максимальных значений R векторов входа;

S1 – число нейронов входного слоя (число кластеров);

PC – вектор размером 1хS2, указывающий распределение по долям каждого класса из набора классов S2;

LR – параметр скорости настройки, по умолчанию 0.01;

LF – функция настройки параметров, по умолчанию learnlv2.

В результате выполнения функции newlog создаётся двухслойная сеть. Первый слой использует функции взвешивания negdist, накопления netsum и передаточную функцию compet. Второй слой использует функции взвешивания dotprod, накопления netsum и передаточную функцию purelin. Слои не имеют смещений. Веса первого слоя инициализируются с помощью функции midpoint; веса второго слоя устанавливаются так, чтобы каждому нейрону на выходе соответствовал единственный нейрон первого слоя. Адаптация и обучение выполняются с помощью функций adaptwb, которая модифицирует веса первого слоя, используя функцию настройки learnlv1.

LVQ – сеть обучается на основе множества пар – выход обучающей последовательности:

{p1, t1}, {p2, t2}, …, {pQ, tQ}.

Каждый целевой вектор имеет единственный элемент, равный единице, а остальные элементы равны нулю.

Предположим, что при задании вектора входа p(q) весовые коэффициенты нейрона i* входного слоя наиболее близки к вектору входа p(q) и нейрон i* выигрывает конкуренцию. Тогда конкурирующая функция compet выдаст единицу в качестве i* -го элемента вектора выхода a­­­­1 первого слоя сети, причём все другие элементы a1 будут равны нулю. Во втором, линейном слое, произведение матрицы весов LW´a1 выявляет некоторый столбец LW, в котором единичное значение указывает на класс k*. Таким образом, сеть связывает вектор входа p(q) с классом k*. Это назначение может оказаться либо правильным, либо ошибочным. Поэтому в процессе обучения необходимо откорректировать строку i* матрицы IW таким образом, чтобы приблизить её к вектору p(q), если назначение правильное, и удалить от вектора p(q) если назначение неправильное:

i*IW(q) = i*IW(q-1)+LR(p(q)-i*IW(q-1)), a2k* = tk* = 1;

i*IW(q) = i*IW(q-1)-LR(p(q)-i*IW(q-1)), (a2k* = 1) ≠ (tk*= 0).

Это правило гарантирует, что при правильной классификации нейрон-победитель приближается к векторам входа данного класса, а при неправильной классификации удаляется от них. Оно различается функцией настройки весов слоя LVQ -сети learnlv1. Другая функция настройки весов learnlv2 позволяет улучшить настройку параметров. Она производит корректировку двух весовых векторов, близких к входному. Два весовых вектора с евклидовыми расстояниям di и dj до вектора входа p считаются близкими, если выполняется условие

min(di*/ dj*, dj*/ di*) > 0.5 0.7.

Если при этом строка i* принадлежит к области в пространстве признаков, соответствующей требуемому классу, а строка j* не принадлежит, то корректировка весов производится следующим образом:

Практические задания

Задание 1. Создать нейронную LVQ -сеть для обучающей последовательности двухэлементных векторов, имеющих 4 нейрона во входном слое и 2 нейрона в выходном с распределением [0.6 0.4], проанализировать её структурную схему и значения параметров вычисленной модели, обучить сеть и промоделировать её на обучающей последовательности, выполнив следующие команды:

P = [-3 -2 -2 0 0 0 0 +2 +2 +3; …

0 +1 -1 2 1 -1 -2 +1 -1 0];

Tc = [1 1 1 2 2 2 2 1 1 1 ]; % – индексы классов;

T = ind2vec(Tc); %разряженная целевая матрица;

T = full(T); %полная целевая матрица;

net = newlvq(minmax(P), 4, [0.6 0.4]); %параметры вычисли-
% тельной модели

gensim(net); %структурная схема LVQ-сети;

net = train(net, P, T); %обучение сети со значениями
%параметров по умолчанию;

Y = sim(net, P) %моделирование LVQ-сети;

Yc = vec2ind(Y) %индексы классов, которые
% получила сеть;

% Сравнить Yc и Tc.

Задание 2. Повторить первое задание для всевозможных векторов индексов и выявить случаи несовпадения Yc и Tc, т. е. случаи неправильной классификации.

Задание 3. Создать нейронную LVQ -сеть с теми же параметрами, что и в первом задании, обучить сеть, промоделировать её, построить график распределения входных векторов по кластерам и разделяющую линию областей точек, принадлежащих разным классам, выполнив следующие команды:

P = [-3 -2 –2 0 0 0 0 +2 +2 +3; …

0 +1 –1 2 1 –1 –2 +1 –1 0]

Tc = [1 1 1 2 2 2 2 1 1 1 ]; % – индексы классов;

T = full(ind2vec(Tc));

net = newlvg(minmax(P), 4, [0.6 0.4]);

net.inputWeights{1, 1}

net.IW{1, 1} % – веса входного слоя после инициализации;

net.LW{2,1} % – веса выходного слоя после инициализации;

net.b{1}, net.b{2}

net.trainParam.epoch = 2000;

net.trainParam.show = 100;

net.trainParam.lr = 0.05;

net = train(net, P, T);

net.IW{1, 1} % – веса выходного слоя после обучения;

net.LW{2, 1} % – веса выходного слоя после обучения;

I1 = find(Tc = = 1); % – вектор индексов первого класса;

I2 = find(Tc = = 2); % – вектор индексов второго класса;

axis([-4, 4, -3, 3]) % – диапазоны для X и Y;

P1 = P(:, I1) % – векторы первого класса;

P2 = P(:, I2) % – векторы второго класса;

V = net.IW{1, 1} % – веса выходного слоя;

plot(P1(1,:), P1(2,:), ′+ k′), hold on

plot(P2(1,:), P2(2,:), ′Íb′), hold on

plot(V(:, 1), V(:, 2), ′or′)

Y = sim(net, P)

Yc=vec2ind(Y)

% Построение разделяющей линии для классов:

function P = mesh2P(x, y) % – начало М-функции;

%Вычисление массива координат прямоугольной сетки

[X,Y] = meshgrid(X, Y);

P = cat(3, X, Y);

[n1, n2, n3] = size(P);

P = permute(P, [3 2 1]);

P = reshape(P, [n3 n1*n2]);

% конец М-функции.

X = -4: 0.2: 4;

Y = -3: 0.2: 3;

P = mesh2P(X, Y);

Y = sim(net, P);

Yc = vec2ind(Y);

I1 = find(Yc = = 1); I2 = find(Yc = = 2);

plot(P(1, I1),P(2, I2), ′+k′), hold on

plot(P(1, I1),P(2, I2), ′*b′).

Задание 4. Создать нейронную LVQ -сеть для разбиения двухэлементных векторов на 8 кластеров и 4 класса, обучить сеть, промоделировать её, построить график распределения векторов по кластерам и разделяющую границу векторов, модифицируя команды 3-го задания.





Дата публикования: 2015-10-09; Прочитано: 439 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.011 с)...