Культура
Искусство
Языки
Языкознание
Вычислительная техника
Информатика
Финансы
Экономика
Биология
Сельское хозяйство
Психология
Ветеринария
Медицина
Юриспруденция
Право
Физика
История
Экология
Промышленность
Энергетика
Этика
Связь
Автоматика
Математика
Электротехника
Философия
Религия
Логика
Химия
Социология
Политология
Геология
|
Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6. В. Г. Потемкин
|
Название |
В. Г. Потемкин
|
Анкор |
Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc |
Дата |
26.04.2017 |
Размер |
14.83 Mb. |
Формат файла |
|
Имя файла |
Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc |
Тип |
Книга
#3790
|
страница |
24 из 50 |
|
7.2. LVQ-сети
Ниже рассматриваются сети для классификации входных векторов, или LVQ (Learning Vector Quantization)-сети. Как правило, они выполняют и кластеризацию и классификацию векторов входа. Эти сети являются развитием самоорганизующихся сетей Кохонена [23].
По команде help lvq можно получить следующую информацию об М-функциях, входящих в состав ППП Neural Network Toolbox и относящихся к построению LVQ-сетей:
Learning Vector Quantization
|
Сети для классификации векторов
|
New networks
|
Формирование сети
|
newlvq
|
Создание сети для классификации входных векторов
|
Using networks
|
Работа с сетью
|
sim
init
adapt
train
|
Моделирование
Инициализация
Адаптация
Обучение
|
Weight functions
|
Операции с весовой функцией
|
negdist
dotprod
|
Функция отрицательного расстояния
Скалярное произведение
|
Net input functions
|
Операции над входами
|
netsum
|
Суммирование
|
Transfer functions
|
Функции активации
|
compet
purelin
|
Конкурирующая
Линейная
|
Performance functions
|
Функции погрешности обучения
|
mse
|
Среднеквадратичная ошибка обучения
|
Initialization functions
|
Функции инициализации сети
|
initlay
initwb
midpoint
|
Послойная инициализация
Инициализация весов и смещений
Инициализация весов по правилу средней точки
|
Learning functions
|
Функции настройки параметров
|
learnlv1
learnlv2
|
Функция настройки lv1
Функция настройки lv2
|
Adapt functions
|
Функции адаптации
|
adapt
|
Адаптация весов и смещений
|
Training functions
|
Функции обучения
|
trainr
|
Повекторное обучение весов и смещений
|
Demonstrations
|
Демонстрационные примеры
|
demolvq1
|
Пример классификации векторов
|
Архитектура сети
Архитектура LVQ-сети, предназначенной для классификации входных векторов,
показана на рис. 7.17.
Рис. 7.17
LVQ-cеть имеет 2 слоя: конкурирующий и линейный. Конкурирующий слой выполняет кластеризацию векторов, а линейный слой соотносит кластеры с целевыми классами, заданными пользователем.
Как в конкурирующем, так и в линейном слое приходится 1 нейрон на кластер или целевой класс. Таким образом, конкурирующий слой способен поддержать до S1 кластеров; эти кластеры, в свою очередь, могут быть соотнесены с S2 целевыми классами, причем S2 не превышает S1. Например, предположим, что нейроны 1–3 конкурирующего слоя определяют 3 кластера, которые принадлежат к одному целевому классу #2 линейного слоя. Тогда выходы конкурирующих нейронов 1–3 будут передаваться в линейный слой на нейрон n2 с весами, равными 1, а на остальные нейроны с весами, равными 0. Таким образом, нейрон n2 возвращает 1, если любой
из трех нейронов 1–3 конкурирующего слоя выигрывает конкуренцию.
Короче говоря, единичный элемент в i-й строке вектора a1 (остальные элементы a1 нулевые) однозначно выберет i-й столбец матрицы весов LW21 в качестве выхода сети. При этом каждый столбец, в свою очередь, содержит единственный элемент, равный 1, который указывает принадлежность к классу. Таким образом, кластер с номером 1 из слоя 1 может оказаться отнесенным к различным классам в зависимости от значения произведения LW21a1.
Поскольку заранее известно, как кластеры первого слоя соотносятся с целевыми
классами второго слоя, то это позволяет заранее задать элементы матрицы весов LW21. Однако чтобы найти правильный кластер для каждого вектора обучающего множества, необходимо выполнить процедуру обучения сети.
Создание сети
В ППП NNT для создания LVQ-сетей предусмотрена М-функция newlvq, обращение
к которой имеет следующий вид:
net = newlvq(PR,S1,PC,LR,LF)
где PR – массив размера R2 минимальных и максимальных значений для R элементов вектора входа; S1 – количество нейронов конкурирующего слоя; PC – вектор с S2 элементами, определяющими процентную долю принадлежности входных векторов к определенному классу; LR – параметр скорости настройки (по умолчанию 0.01); LF – имя функции настройки (по умолчанию для версии MATLAB 5 – 'learnlv2', для версии MATLAB 6 – 'learnlv1').
Предположим, что задано 10 векторов входа и необходимо создать сеть, которая,
во-первых, группирует эти векторы в 4 кластера, а во-вторых, соотносит эти кластеры
с одним из двух выходных классов. Для этого следует использовать LVQ-сеть, первый конкурирующий слой которой имеет 4 нейрона по числу кластеров, а второй линейный слой – 2 нейрона по числу классов.
Зададим обучающую последовательность в следующем виде:
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];
Из структуры обучающей последовательности следует, что 3 первых и 3 последних ее вектора относятся к классу 1, а 4 промежуточных – к классу 2. На рис. 7.18 показано расположение векторов входа.
I1 = find(Tc==1); I2 = find(Tc==2);
axis([–4,4,–3,3]), hold on
plot(P(1,I1),P(2,I1),’+k’)
plot(P(1,I2),P(2,I2),’xb’) % Рис.7.18
Рис. 7.18
Векторы, относящиеся к разным классам, отмечены разными символами. Как следует из расположения векторов, классы не являются линейно отделимыми, и задача не может быть решена с использованием, например, персептрона.
Преобразуем вектор индексов Tc в массив целевых векторов:
T = full(ind2vec(Tc))
T =
1 1 1 0 0 0 0 1 1 1
0 0 0 1 1 1 1 0 0 0
Процентные доли входных векторов в каждом классе равны 0.6 и 0.4 соответственно. Теперь подготовлены все данные, необходимые для вызова функции newlvq. Вызов может быть реализован c использованием следующего оператора
net = newlvq(minmax(P),4,[.6 .4],0.1);
net.layers{1}
ans =
dimensions: 4
distanceFcn: 'dist'
distances: [44 double]
initFcn: 'initwb'
netInputFcn: 'netsum'
positions: [0 1 2 3]
size: 4
topologyFcn: 'hextop'
transferFcn: 'compet'
userdata: [11 struct]
|
net.layers{2}
ans =
dimensions: 2
distanceFcn: 'dist'
distances: [22 double]
initFcn: 'initwb'
netInputFcn: 'netsum'
positions: [0 1]
size: 2
topologyFcn: 'hextop'
transferFcn: 'purelin'
userdata: [11 struct]
|
Обучение сети
Правила настройки параметров
Правило LVQ1. LVQ-сеть обучается на основе множества пар вход/выход, составленных из элементов обучающей последовательности {P, T}:
. (7.20)
Каждый целевой вектор имеет единственный элемент, равный 1, а остальные равны 0.
Для обучения сети необходимо задать вектор входа p, и тогда в конкурирующем слое будет выполнена настройка элементов матрицы весов IW11. Предположим, что весовые коэффициенты нейрона i* наиболее близки к вектору входа p и нейрон i* выигрывает конкуренцию. Тогда конкурирующая функция активации возвращает 1 в качестве элемента i* вектора a1, причем все другие элементы a1 равны 0. Во втором, линейном слое произведение LW21a1 выделяет некоторый столбец матрицы LW21 и связанный с ним класс k*. Таким образом, сеть связывает вектор входа p с классом k*. Это назначение может оказаться либо правильным, либо ошибочным. Поэтому в процессе обучения необходимо откорректировать строку i* матрицы IW11 таким образом, чтобы приблизить ее к вектору p, если назначение правильное, и удалить от вектора p, если назначение неправильное. Основываясь на этих рассуждениях, можно сформулировать правило LVQ1 для настройки параметров сети:
(7.21)
Это правило гарантирует, что при правильной классификации нейрон-победитель приближается к векторам входа, а при неправильной классификации удаляется от них.
Правило LVQ2. Это правило предназначено для того, чтобы улучшить настройку параметров сети после применения стандартной процедуры LVQ1. Вариант, реализованный в версии MATLAB 6, известен в литературе [23] как LVQ2.1, и именно он положен в основу алгоритма learnlv2. Правило LVQ2 во многом схоже с правилом LVQ1, за исключением лишь того, что в соответствии с правилом LVQ2 корректируется 2 весовых вектора, ближайших к входному; причем один из них должен быть классифицирован как правильный, а второй – нет. Введем следующие понятия, чтобы дать количественную оценку свойства близости векторов. Пусть величины di и djобозначают евклидовы расстояния вектора p
от соответствующих строк i* и j* весовой матрицы IW11, причем строка j* принадлежит
к области в пространстве признаков, соответствующей требуемому классу, а строка i* не принадлежит. Если выполняется условие
(7.22)
то корректировка производится и правило настройки соответствующих весовых векторов выглядит следующим образом:
(7.23)
Процедура обучения
Для удобства работы с текстом повторим операторы задания обучающей последовательности и формирования 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));
Выполним синтез LVQ-сети:
net = newlvq(minmax(P),4,[.6 .4]);
net.inputWeights{1}
ans =
delays: 0
initFcn: 'midpoint'
learn: 1
learnFcn: 'learnlv2'
learnParam: [11 struct]
size: [4 2]
userdata: [11 struct]
weightFcn: 'negdist'
Для обучения сети применим М-функцию train, задав количество циклов обучения равным 2000, и значение параметра скорости обучения 0.05:
net.trainParam.epochs = 2000;
net.trainParam.show = 100;
net.trainParam.lr = 0.05;
net = train(net,P,T);
В результате обучения получим следующие весовые коэффициенты нейронов конкурирующего слоя, которые определяют положения центров кластеризации:
V = net.IW{1,1}
V =
–2.3639 0.0074775
2.3461 0.033489
0 –1.4619
0 1.4731
Построим картину распределения входных векторов по кластерам (рис. 7.19):
I1 = find(Tc==1); I2 = find(Tc==2);
axis([–4,4,–3,3]), hold on
P1 = P(:,I1); P2 = P(:,I2);
plot(P1(1,:),P1(2,:),'+k')
plot(P2(1,:),P2(2,:),'xb')
plot(V(:,1),V(:,2),'or') % Рис.7.19
Рис. 7.19
В свою очередь, массив весов линейного слоя указывает, как центры кластеризации распределяются по классам:
net.LW{2}
ans =
1 1 0 0
0 0 1 1
Нетрудно видеть, что обучение сети выполнено правильно. Чтобы проверить функционирование сети, подадим на ее вход массив обучающих векторов P:
Y = sim(net,P)
Yc = vec2ind(Y)
Yc = 1 1 1 2 2 2 2 1 1 1
Результат подтверждает, что классификация выполнена правильно.
Теперь построим границу, разделяющую области точек, принадлежащих к двум классам. Для этого покроем сеткой прямоугольную область и определим принадлежность каждой точки к тому или иному классу. Текст соответствующего сценария и вспомогательной М-функции приведен ниже
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,I1),'+k'), hold on
plot(P(1,I2),P(2,I2),'*b') % Рис.7.20
|
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]);
|
Результат работы этого сценария представлен на рис. 7.20. Здесь же отмечены вычисленные ранее центры кластеризации для синтезированной LVQ-сети. Анализ рисунка подтверждает, что граница между областями не является прямой линией.
Рис. 7.20
Наряду с процедурой обучения можно применить и процедуру адаптации в течение 200 циклов для 10 векторов, что равносильно 2000 циклам обучения с использованием функции train:
net.adaptparam.passes = 200;
Обучающая последовательность при использовании функции adapt должна быть представлена в виде массивов ячеек:
Pseq = con2seq(P);
Tseq = con2seq(T);
net = adapt(net,Pseq,Tseq);
net.IW{1,1}
ans =
–2.3244 –0.0033588
2.3311 –0.0033019
–0.0003663 1.4704
–0.0003663 –1.4754
Промоделируем сеть, используя массив входных векторов обучающей последовательности:
Y = sim(net,P);
Yc = vec2ind(Y)
Yc = 1 1 1 2 2 2 2 1 1 1
Результаты настройки параметров сети в процессе адаптации практически совпадают с результатами обучения.
Единственное, что можно было бы напомнить при этом, что при обучении векторы входа выбираются в случайном порядке и поэтому в некоторых случаях обучение может давать лучшие результаты, чем адаптация.
Можно было бы и процедуру адаптации реализовать с использованием случайной последовательности входов, например следующим образом: сформируем 2000 случайных векторов и выполним лишь 1 цикл адаптации:
TS = 2000;
ind = floor(rand(1,TS)*size(P,2))+1;
Pseq = con2seq(P(:,ind));
Tseq = con2seq(T(:,ind));
net.adaptparam.passes = 1;
net = adapt(net,Pseq,Tseq);
net.IW{1,1}
ans =
2.354 –0.061991
–2.362 –0.093345
0 –1.4834
0 1.4539
Y = sim(net,P);
Yc = vec2ind(Y)
Yc = 1 1 1 2 2 2 2 1 1 1
В результате получаем LVQ-сеть, подобную тем, которые были получены ранее с помощью процедур обучения и адаптации.
Читатель может продолжить изучение LVQ-сетей, обратившись к демонстрационной программе demolvq1.
|
|
|