Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc
Скачиваний:
864
Добавлен:
07.03.2016
Размер:
15.55 Mб
Скачать

Архитектура сети

Архитектура 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]