Главная страница
Культура
Искусство
Языки
Языкознание
Вычислительная техника
Информатика
Финансы
Экономика
Биология
Сельское хозяйство
Психология
Ветеринария
Медицина
Юриспруденция
Право
Физика
История
Экология
Промышленность
Энергетика
Этика
Связь
Автоматика
Математика
Электротехника
Философия
Религия
Логика
Химия
Социология
Политология
Геология

Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6. В. Г. Потемкин



Скачать 14.83 Mb.
Название В. Г. Потемкин
Анкор Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc
Дата 26.04.2017
Размер 14.83 Mb.
Формат файла doc
Имя файла Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc
Тип Книга
#3790
страница 24 из 50
1   ...   20   21   22   23   24   25   26   27   ...   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 – массив размера R2 минимальных и максимальных значений для 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: [44 double]

initFcn: 'initwb'

netInputFcn: 'netsum'

positions: [0 1 2 3]

size: 4

topologyFcn: 'hextop'

transferFcn: 'compet'

userdata: [11 struct]

net.layers{2}

ans =

dimensions: 2

distanceFcn: 'dist'

distances: [22 double]

initFcn: 'initwb'

netInputFcn: 'netsum'

positions: [0 1]

size: 2

topologyFcn: 'hextop'

transferFcn: 'purelin'

userdata: [11 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: [11 struct]

size: [4 2]

userdata: [11 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.
1   ...   20   21   22   23   24   25   26   27   ...   50
написать администратору сайта