close

Вход

Забыли?

вход по аккаунту

?

Лр 2

код для вставкиСкачать
Лабораторная работа № 2
Классификация на многослойной нейронной сети прямого распространения
Цель работы: Изучение особенностей применения МНСПР для классификации и способов формирования примеров для бинарной классификации.
Методика выполнения работы.
Бинарная классификация — частный случай распознавания образов, когда входные данные могут принадлежать только двум классам. Далее эти два класса будем называть “один” и “два”. Для бинарной классификации используют структуру МНСПР приведенную на рис. 2.1. Рис. 2.1. Структура входов и выходов МНСПР для решения задачи бинарной классификации
Для данной задачи входной набор образов можно представить матрицей I, которая имеет размерность RxNp, где R — число признаков образа, Np—число образов. Эталонный выход можно представить вектором O, который имеет размерность 1xNp и принимает значения {-1 1}.
В данной работе исследуются функциональные возможности МНСПР в зависимости от её размерности на примере бинарной классификации двухмерного входного вектора. Последовательность создания м-файла покажем для решения задачи классификации линейно-разделимых входных данных. Создадим случайные входные данные по x, y в диапазоне [- ].
% КОД 1// Создание случайных входных данных
Np = 5% Количество примеров
x = 2*pi*(0.5-rand(Np));% входная матрица X (Np x Np)
y = 2*pi*(0.5-rand(Np));% входная матрица Y (Np x Np)
figure(1), plot(x,y,'k.'),axis([-pi pi -pi pi]) % область просмотра
Результатом выполнения данного кода показан на рис. 1 а. Функция axis ограничивает область просмотра в диапазоне [- ].
Определим принадлежность входных данных к классам {-1 1} по формуле z = sign(y – f(x)), где f(x) = 1.5*x+1.5 и описывает прямую проходящую через плоскость. % КОД 2.// Формирование выходных данных (классов)
K=1; % (по № варианта)
f = @(x) (K*x + K); % описание функции границы классов z = sign(y-f(x)); z(find(z >= 0)) = 1; % определяем классы {-1 +1}
i1 = find(z >= 0); i2 = find(z<0); % находим индексы для класса 1 и 2
figure(1), plot(x(i1),y(i1),'g.',x(i2),y(i2),'b.'), axis([-pi pi -pi pi])% область просмотра
Функция find возвращает вектор индексов i1 и i2, удовлетворяющих условию принадлежности к классам. Отразим на рисунке значения входных векторов с индексами i1 точечными маркерам зеленого цвета, входных векторов с индексами i2 маркерам синего цвета (рис. 2.2 б).
На основании входных и выходных данных необходимо сформировать обучающую выборку Ii = {xi, yi} Oi = {zi}, где i=1,…,Np*Np.
% КОД 3.// Создание обучающей выборки
I = [x(:) y(:)]'; % переводим все вх данные в размерность 2хNp
O = z(:)'; % переводим все значения классов в размерность 1хNp Рис.1. Результат выполнения кода 1(а) и кода 2 (б) для N=5
Для классификации линейно-разделимых данных достаточно использовать однослойную НС. Формально выходной нейрон должен иметь релейную характеристику, но тогда невозможно будет использовать алгоритмы обучения, основанные на вычислении градиента, поэтому функция преобразования выбирается tansig, которая удовлетворяет требованиям по обучению и близка к релейной. При обучении будем использовать метод trainlm, который обладает высокой скоростью сходимости.
% КОД 4.// Создание и Обучение НС
net = newff(minmax(I), [1],{'tansig'},'trainlm');
net.trainParam.epochs = 150;
net.trainParam.goal = 1e-10;
net=train(net,I,O);
Если после обучения достигнута желаемая точность, то НС теперь способна решать задачу классификации. Для проверки свойств обобщения НС создадим тестовую выборку, охватывающую все возможные значения x, y по заданной сетке в диапазоне [- ] c шагом 0.1. Функция meshgrid формирует матрицы х и у в заданном диапазоне.
% КОД 5// Создание тестовой выборки
[x, y] = meshgrid(-pi:0.1:pi); % формируем сетку
z = sign(y-f(x)); z(find(z >= 0)) = 1; % определяем классы {-1 +1}
I = [x(:) y(:)]'; % переводим все входные данные в размерность 2хNp
Подадим тестовые данные на НС и отобразим результаты классификации по аналогии с кодом 2. Для визуального сравнения с желаемым разбиением входных данных на этом же рисунке покажем эталонную функцию f(xe), которую нарисуем красной линией. % КОД 6// Тестирование НС, отображение результатов классификации
out_nn = sign(sim(net, I)); % переводим выход НС в {-1, +1}
i1 = find(out_nn >= 0); i2 = find(out_nn < 0); % находим индексы для класса 1 и 2
xe = -pi:0.1:pi; figure(2), plot(x(i1),y(i1),'g.', x(i2),y(i2),'b.', xe, f(xe), 'r-'), axis([-pi pi -pi pi])
E = sum(1-z(:).*out_nn')/2 % количество неверно распознаных title(['Error: ' num2str(E)]) Для численной оценки посчитаем количество неверно распознанных входных данных E и отобразим полученное значение в заголовке на рисунке с помощью функции title. Результат тестирования имеет вид представленный на рис. 2, где красная линия – желаемое разделение. Для однослойной НС можно посмотреть полученную функцию разделения %ye = -net.IW{1,1}(1)/net.IW{1,1}(2)*xe - net.b{1}/net.IW{1,1}(2);
Задание 1. Исследовать обобщающие способности НС для линейного разделения классов. 1. Составить программу в MATLAB состоящую из кодов 1-6.
2. Задать в коде 2 K из таблицы 1 в соответствии с номером варианта.
3. Изменяя количество примеров Np = {5, 10, 15, 20, 30, 40} оценить влияние случайной выборки на качество классификации визуально и на основании количество неверно распознанных входных данных E. Для каждого значения Np повторить расчет 3 раза и вычислить среднее значение Eav = (E1+E2+E3)/3.
Отчет по заданию 1 должен содержать текст программы, рисунки для пункта 3 при значение Np={5, 40}, Eav для каждого значения Np.
Таблица 1
№ вар
3
K
2
Результат выполнения
Рис.2.1. Результат тестирования НС, Np=5.
Рис.2.2. Результат выполнения кода 2, Np=10
Рис.2.3. Результат тестирования НС, Np=10
.
Рис.2.4. Результат выполнения кода 2, Np=15
Рис.2.5. Результат тестирования НС, Np=15
Рис.2.6. Результат выполнения кода 2, Np=20
Рис.2.7. Результат тестирования НС, Np=20
Рис.2.8. Результат выполнения кода 2, Np=30
Рис.2.9. Результат тестирования НС, Np=30
Рис.2.10. Результат выполнения кода 2, Np=40
Рис.2.11. Результат тестирования НС, Np=40
Np
E
5
40
514
88
10
16
18
49
15
0
1
40
20
0
26
22
30
5
0
0
40
0
0
2
Таблица 2 Eav для каждого значения Np
Задание 2. Исследовать обобщающие способности НС для нелинейного разделения классов.
1. Составить программу в MATLAB состоящую из кодов 1-6.
2. Заменить в коде 2 функцию разделения классов f = @(x) (K*sin(x));
3. Задать в коде 2 K из таблицы 1 в соответствии с номером варианта.
4. Добавить скрытый слой нейронов в задании НС, т.е. в коде 4 изменить задание НС на следующую строку
net = newff(minmax(I), [N 1],{'tansig' 'tansig'},'trainlm');
5. Задать Np = 50 и подобрать минимальное количество нейронов в скрытом слое N.
6. Изменяя количество примеров Np = {5, 10, 15, 20, 30, 40} оценить влияние случайной выборки на качество классификации визуально и на основании количество неверно распознанных входных данных E. Для каждого значения Np повторить расчет 3 раза и вычислить среднее значение Eav = (E1+E2+E3)/3.
Отчет по заданию 2 должен содержать текст программы, рисунок для пункта 6, минимальное количество нейронов в скрытом слое, Eav для каждого значения Np.
% КОД 1// Создание случайных входных данных
Np = 50 % Количество примеров
x = 2*pi*(0.5-rand(Np)); % входная матрица X (Np x Np)
y = 2*pi*(0.5-rand(Np)); % входная матрица Y (Np x Np)
figure(1), plot(x,y,'k.'),axis([-pi pi -pi pi]) % область просмотра
% КОД 2.// Формирование выходных данных (классов)
K=2; % (по № варианта)
2. f = @(x) (K*sin(x)); % описание функции границы классов z = sign(y-f(x)); z(find(z >= 0)) = 1; % определяем классы {-1 +1}
i1 = find(z >= 0); i2 = find(z<0); % находим индексы для класса 1 и 2
figure(1), plot(x(i1),y(i1),'g.',x(i2),y(i2),'b.'), axis([-pi pi -pi pi]) % область просмотра
% КОД 3.// Создание обучающей выборки
I = [x(:) y(:)]'; % переводим все вх данные в размерность 2хNp
O = z(:)'; % переводим все значения классов в размерность 1хNp % КОД 4.// Создание и Обучение НС
net = newff(minmax(I), [N 1],{'tansig' 'tansig'},'trainlm');
net.trainParam.epochs = 150;
net.trainParam.goal = 1e-10;
net=train(net,I,O);
% КОД 5// Создание тестовой выборки
[x, y] = meshgrid(-pi:0.1:pi); % формируем сетку
z = sign(y-f(x)); z(find(z >= 0)) = 1; % определяем классы {-1 +1}
I = [x(:) y(:)]'; % переводим все входные данные в размерность 2хNp
% КОД 6// Тестирование НС, отображение результатов классификации
out_nn = sign(sim(net, I)); % переводим выход НС в {-1, +1}
i1 = find(out_nn >= 0); i2 = find(out_nn < 0); % находим индексы для класса 1 и 2
xe = -pi:0.1:pi; figure(2), plot(x(i1),y(i1),'g.', x(i2),y(i2),'b.', xe, f(xe), 'r-'), axis([-pi pi -pi pi])
E = sum(1-z(:).*out_nn')/2 % количество неверно распознаных title(['Error: ' num2str(E)]) Зададим Np=50 и найдем минимальное количество нейронов в скрытом слое N =3.
Результат выполнения
Рис.3.1 Результат выполнения кода 2, Np=5
Рис.3.2 Результат тестирования НС, Np=5
Рис.3.3. Результат выполнения кода 2, Np=10
Рис.3.4. Результат тестирования НС, Np=10
Рис.3.5. Результат выполнения кода 2, Np=20
Рис.3.6. Результат тестирования НС, Np=20
Рис.3.7. Результат выполнения кода 2, Np=30
Рис.3.8. Результат тестирования НС, Np=30
Рис.3.9. Результат выполнения кода 2, Np=40
Рис.3.10. Результат тестирования НС, Np=40
Np
E
5
933
800
533
10
552
561
314
20
59
360
78
30
37
13
93
40
15
10
10
Таблица 3 Eav для каждого значения Np
Рисунок 4. График зависимости среднеквадратичной ошибки в зависимости от количества нейронов в скрытом слое.
Документ
Категория
Рефераты
Просмотров
26
Размер файла
8 287 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа