15 июня 2010 г.

Нейронные сети в Matlab. Аппроксимация функций

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



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

1 2 3 4 5 6 7 ...
4,19 9,85 8,64 -8,16 9,07 -6,74 9,41 ...
-2,12 -8,89 -6,30 2,44 -8,44 -6,28 -9,42 ...

Для наглядности изобразим точки функции на плоскости:




Создать нейронную сеть в Matlab возможно тремя способами:

  • с помощью функции командной строки
  • используя графический интерфейс пользователя
    •    nftool
    •    nntool
Мы рассмотрим первый из них. Разобрав его можно будет с легкостью разобраться с командами 
nftool и nntool.
Представление исходных данных

Для аппроксимации  функции, ее аргументы (x1,[x2,…]) представим в виде столбцов, сгруппированных в матрицу. Значения (y1,[y2,…])- аналогично. Столбцы матриц аргуменов X и значений Y должны соответствовать.
Например, аргументы и результаты для задачи XOR будут такими:
  
  Inputs  = [0 1 0 1;
             0 0 1 1];
  Targets = [0 0 0 1];

В нашем примере мы сами создадим исходные значения функции.
L=100;
NOISE=rand(1,L)*1.5-0.75;
X=rand(1,L)*20-10;
Y=X.*cos(X)+NOISE;
TABLE=[X;Y];

Создание НС из командной строки

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

Количество нейронов N используемых в скрытом слое зависит от сложности решаемой задачи (в данном случае аппроксимируемой функции).
NET = newfit(X,Y,N);

Обучение сети
По умолчанию для обучения данная нейронная сеть использует алгоритм Левенберга-Маркварта [Levenberg-Marquardt]. Входные и целевые векторы в случайном порядке данные делятся на три набора:
  •  60% векторов используются для обучения;
  •  20% векторов – для проверки достоверности результатов и чтобы избежать перетренировки сети; 
  •  Последние 20% используются для независимого испытания сети
Тренировка НС

Чтобы тренировать сеть, введите:
NET=train(NET, X,Y);

Откроется окно

Оно показывает процесс тренировки сети и позволяет его прервать, нажав кнопку “Stop Training”.
По умолчанию остановка процесса обучения происходит, когда среднеквадратичная ошибка проверки достоверности результатов возрастает шесть эпох подряд. 
В этом примере, результат адекватен из следующих соображений:
  • Заключительная среднеквадратичная ошибка (СКО) мала.
  • Ошибка проверочного (Validation) и тестового (Test) наборов утверждения имеют подобные характеристики.
  • Переобучения не произошло (после точки остановки происходит лишь увеличение СКО проверочного набора до 16-й эпохи ).
На следующем рисунке можем увидеть аппроксимированную функцию-результат.

Еще одним полезным инструментом оценки результата обучения нейронной сети может быть построение функций регрессии  результатов Output (которые дает обученная нейронная сеть)  от целевых значений Y (которые были изначальным условием нашей задачи).



Если результаты аппроксимации оказались неудовлетворительными можно попробовать какой-либо из следующих подходов:
  • Увеличить число скрытых нейронов.
  • Увеличить число учебных векторов.
  • Увеличьте число входных переменных, если таковые имеются.
  • Использовать другой алгоритм обучения (http://www.mathworks.com/access/helpdesk/help/toolbox/nnet/backpro7.html)

 В данном случае, нас устраивает тренированность сети NET.


Использование нейронной сети для получения значений  аппроксимируемой функции.

Используя тренированную сеть NET, получим значения искомой функции для аргументов из интервала [-10;10] с интервалом 0.5.

X_rez=-10:0.5:10;
Y_rez = sim(NET, X_rez);
plot(X_rez,Y_rez,'LineStyle','none','Marker','.','MarkerSize',15);

Комментариев нет:

Отправить комментарий