Нейронные сети Изучения векторного квантования (LVQ)

Архитектура

Архитектуру сети LVQ показывают ниже.

Сеть LVQ имеет первый конкурентоспособный слой и второй линейный слой. Конкурентоспособный слой учится классифицировать входные векторы почти таким же способом как конкурентоспособные слои Кластера с Самоорганизующейся Нейронной сетью Карты, описанной в этой теме. Линейный слой преобразовывает классы конкурентоспособного слоя в целевые классификации, заданные пользователем. Классы, изученные конкурентоспособным слоем, упоминаются как подклассы и классы линейного слоя как целевые классы.

И конкурентоспособные и линейные слои имеют один нейрон на (sub или цель) класс. Таким образом конкурентоспособный слой может изучить до S 1 подкласс. Они, в свою очередь, объединены линейным слоем, чтобы сформировать S 2 целевых класса. (S 1 всегда больше, чем S 2.)

Например, предположите нейроны 1, 2, и 3 в конкурентоспособном слое, все изучают подклассы входного пробела, который принадлежит линейному целевому классу 2 слоя. Затем конкурентоспособные нейроны 1, 2, и 3 будут иметь веса LW2,1 1,0 к нейрону n2 в линейном слое и весах 0 ко всем другим линейным нейронам. Таким образом линейный нейрон производит 1, если какой-либо из трех конкурентоспособных нейронов (1, 2, или 3) выигрывает соревнование и выводит 1. Это - то, как подклассы конкурентоспособного слоя объединены в целевые классы в линейном слое.

Короче говоря, 1 в ith строке a1 (остальные к элементам a1 будут нулем) эффективно выбирает ith столбец LW2,1 как сетевой вывод. Каждый такой столбец содержит один 1, соответствуя определенному классу. Таким образом разделите 1 с на подклассы от слоя 1, помещаются в различные классы умножением LW2,1a1 в слое 2.

Вы знаете заранее, какая часть нейронов слоя 1 должна быть классифицирована в различный класс выходные параметры слоя 2, таким образом, можно указать элементы LW2,1 в запуске. Однако необходимо пройти метод обучения, чтобы заставить первый слой производить правильный подкласс вывод для каждого вектора набора обучающих данных. Это обучение обсуждено в Обучении. Во-первых, рассмотрите, как создать исходную сеть.

Создание сети LVQ

Можно создать сеть LVQ с функциональным lvqnet,

net = lvqnet(S1,LR,LF)

где

  • S1 является количеством первого слоя скрытые нейроны.

  • LR является темпом обучения (значение по умолчанию 0.01).

  • LF является функцией изучения (значением по умолчанию является learnlv1).

Предположим, что у вас есть 10 входных векторов. Создайте сеть, которая присваивает каждый из этих входных векторов к одному из четырех подклассов. Таким образом в первом конкурентоспособном слое существует четыре нейрона. Эти подклассы затем присвоены одному из двух выходных классов этими двумя нейронами в слое 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];

Это может помочь показать детали того, что вы получаете от этих двух строк кода.

P,Tc
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

График входных векторов следует.

Как вы видите, существует четыре подкласса входных векторов. Вы хотите сеть, которая классифицирует p1, p2, p3, p8, p9, и p10, чтобы произвести вывод 1, и это классифицирует векторы p4, p5, p6, и p7, чтобы произвести вывод 2. Обратите внимание на то, что эта проблема нелинейно отделима, и так не может быть решена perceptron, но сеть LVQ не испытывает затруднений.

Затем преобразуйте матрицу Tc, чтобы предназначаться для векторов.

T = ind2vec(Tc);

Это дает разреженной матрице T, который может быть отображен полностью с

targets = full(T)

который дает

targets =
     1     1     1     0     0     0     0     1     1     1
     0     0     0     1     1     1     1     0     0     0

Это выглядит правильным. Это говорит, например, что, если у вас есть первый столбец P, как введено, необходимо получить первый столбец targets как вывод; и тот вывод говорит входные падения класса 1, который правилен. Теперь вы готовы вызвать lvqnet.

Вызовите lvqnet, чтобы создать сеть с четырьмя нейронами.

net = lvqnet(4);

Сконфигурируйте и подтвердите, что начальные значения матрицы веса первого слоя инициализируются функциональной средней точкой к значениям в центре области значений входных данных.

net = configure(net,P,T);
net.IW{1}
ans =
     0     0
     0     0
     0     0
     0     0

Подтвердите, что веса второго слоя имеют 60% (6 из 10 в Tc) его столбцов с 1 в первой строке, (соответствие классу 1), и 40% его столбцов имеют 1 во второй строке (соответствующий классу 2). Только с четырьмя столбцами 60% и 40%, на самом деле круглых к 50% и существует два 1's в каждой строке.

net.LW{2,1}
ans =
     1     1     0     0
     0     0     1     1

Это целесообразно также. Это говорит, что, если конкурентоспособный слой производит 1 как первый или второй элемент, входной вектор классифицируется как класс 1; в противном случае это - класс 2.

Вы можете заметить, что первые два конкурентоспособных нейрона соединяются с первым линейным нейроном (с весами 1), в то время как вторые два конкурентоспособных нейрона соединяются со вторым линейным нейроном. Все другие веса между конкурентоспособными нейронами и линейными нейронами имеют значения 0. Таким образом каждый из двух целевых классов (линейные нейроны) является, на самом деле, объединением двух подклассов (конкурентоспособные нейроны).

Можно моделировать сеть с sim. Используйте исходную матрицу P, как введено только, чтобы видеть то, что вы получаете.

Y = net(P);
Yc = vec2ind(Y)
Yc =
     1     1     1     1     1     1     1     1     1     1

Сеть классифицирует все входные параметры в класс 1. Поскольку это не то, что вы хотите, необходимо обучить сеть (настраивающий веса только слоя 1), прежде чем можно будет ожидать хороший результат. Следующие два раздела обсуждают два LVQ изучение правил и учебного процесса.

Правило (learnlv1) изучения LVQ1

LVQ изучение в конкурентоспособном слое основан на наборе пар входа/цели.

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

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

{p1=[210],t1=[0010]}

Здесь существуют входные векторы трех элементов, и каждый входной вектор должен быть присвоен одному из четырех классов. Сеть должна быть обучена так, чтобы она классифицировала входной вектор, показанный выше в третий из четырех классов.

Чтобы обучить сеть, входной вектор p представлен, и расстояние от p до каждой строки входной матрицы IW1,1 веса вычисляется с функциональным negdist. Скрытые нейроны слоя 1 конкурируют. Предположим, что i th элемент n1 является самым положительным, и нейрон, i* выигрывает соревнование. Затем конкурентоспособная передаточная функция производит 1 как i *th элемент a1. Все другие элементы a1 0.

Когда a1 умножается на веса слоя 2 LW2,1, один 1 в a1 выбирает класс k* сопоставленный с входом. Таким образом сеть присвоила входной вектор p, чтобы классифицировать k*, и α2k* будет 1. Конечно, это присвоение может быть хорошим или плохим, поскольку tk* может быть 1 или 0, в зависимости от того, принадлежал ли вход, чтобы классифицировать k* или нет.

Настройте i *th строка IW1,1 таким способом как, чтобы подвинуть эту строку поближе к входному вектору p, если присвоение правильно, и отодвинуть строку от p, если присвоение является неправильным. Если p классифицируется правильно,

(αk2=tk=1)

вычислите новое значение i *th строка IW1,1 как

IiW1,1(q)=IiW1,1(q1)+α(p(q)IiW1,1(q1))

С другой стороны, если p классифицируется неправильно,

(αk2=1tk=0)

вычислите новое значение i *th строка IW1,1 как

IiW1,1(q)=IiW1,1(q1)α(p(q)IiW1,1(q1))

Можно сделать эти исправления к i *th строкой IW1,1 автоматически, не влияя на другие строки IW1,1, распространением спины ошибки на выходе к слою 1.

Такие исправления перемещают скрытый нейрон к векторам, которые попадают в класс, для которого он формирует подкласс, и далеко от векторов, которые попадают в другие классы.

Функцией изучения, которая реализует эти изменения в весах слоя 1 в сетях LVQ, является learnlv1. Это может быть применено во время обучения.

Обучение

Затем необходимо обучить сеть, чтобы получить веса первого слоя, которые приводят к правильной классификации входных векторов. Вы делаете это с train как со следующими командами. Во-первых, установите учебные эпохи на 150. Затем используйте train:

net.trainParam.epochs = 150;
net = train(net,P,T);

Теперь подтвердите веса первого слоя.

net.IW{1,1}
ans =
    0.3283    0.0051
   -0.1366    0.0001
   -0.0263    0.2234
         0   -0.0685

Следующий график показывает, что эти веса переместились к их соответствующим группам классификации.

Чтобы подтвердить, что эти веса действительно приводят к правильной классификации, возьмите матричный P, как введено и моделируйте сеть. Затем смотрите, какие классификации производятся сетью.

Y = net(P);
Yc = vec2ind(Y)

Это дает

Yc =
     1     1     1     2     2     2     2     1     1     1

который ожидается. Как последняя проверка, попробуйте вход близко к вектору, который использовался в обучении.

pchk1 = [0; 0.5];
Y = net(pchk1);
Yc1 = vec2ind(Y)

Это дает

Yc1 =
     2

Это выглядит правильным, потому что pchk1 близко к другим векторам, классифицированным как 2. Точно так же

pchk2 = [1; 0];
Y = net(pchk2);
Yc2 = vec2ind(Y)

дает

Yc2 =
     1

Это выглядит правильным также, потому что pchk2 близко к другим векторам, классифицированным как 1.

Вы можете хотеть попробовать пример программы demolvq1. Это следует за обсуждением обучения, данного выше.

Дополнительное правило (learnlv2) изучения LVQ2.1

Следующее правило изучения является тем, которое может быть применено после первого применения LVQ1. Это может улучшить результат первого изучения. Эта конкретная версия LVQ2 (называемый LVQ2.1 в литературе [Koho97]) воплощена в функциональном learnlv2. Обратите внимание снова, что LVQ2.1 должен использоваться только после того, как LVQ1 был применен.

Изучение здесь подобно этому в learnlv2 кроме теперь двух векторов слоя 1, которые являются самыми близкими к входному вектору, может быть обновлен, при условии, что каждый принадлежит правильному классу, и каждый принадлежит неправильному классу, и далее при условии, что вход попадает в “окно” около midplane этих двух векторов.

Окно задано

min(didj,djdi)>s

где

s1w1+w

(где di и dj являются Евклидовыми расстояниями p от i *IW1,1 и j *IW1,1, соответственно). Примите значение для w в области значений 0.2 к 0,3. Если вы выбираете, например, 0.25, то s = 0.6. Это означает, что, если минимум двух отношений расстояния больше, чем 0,6, эти два вектора настроены. Таким образом, если вход около midplane, настройте эти два вектора, при условии также, что входной вектор p и j *IW1,1 принадлежат тому же классу, и p и i *IW1,1, не принадлежат того же класса.

Внесенные корректировки

IiW1,1(q)=IiW1,1(q1)α(p(q)IiW1,1(q1))

и

IjW1,1(q)=IjW1,1(q1)+α(p(q)IjW1,1(q1))

Таким образом, учитывая два вектора, самые близкие к входу, пока, каждый принадлежит неправильному классу и другому к правильному классу, и пока входные падения midplane окна, эти два вектора настроены. Такая процедура позволяет вектор, который едва-едва классифицируется правильно с LVQ1, который будет перемещен еще ближе во вход, таким образом, результаты более устойчивы.

Функция

Описание

competlayer

Создайте конкурентоспособный слой.

learnk

Kohonen, изучающий правило.

selforgmap

Создайте самоорганизующуюся карту.

learncon

Функция изучения смещения совести.

boxdist

Расстояние между двумя радиус-векторами.

dist

Евклидова функция веса расстояния.

linkdist

Соедините функцию расстояния.

mandist

Манхэттенская функция веса расстояния.

gridtop

Функция топологии слоя Gridtop.

hextop

Шестиугольная функция топологии слоя.

randtop

Случайная функция топологии слоя.

lvqnet

Создайте учащуюся векторную сеть квантования.

learnlv1

Функция изучения веса LVQ1.

learnlv2

Функция изучения веса LVQ2.