Моделирование временных рядов на базе NARX нейронных сетей с обратной связью

Чтобы видеть примеры использования сетей NARX, применяемых в многошаговом прогнозировании разомкнутой и замкнутой обратной связи, см. Многоступенчатое Предсказание Нейронной сети.

Все определенные динамические сети, обсужденные до сих пор, или были фокусируемыми сетями с динамикой только на входном слое или сетях прямого распространения. Нелинейная авторегрессивная сеть с внешними входными параметрами (NARX) является текущей динамической сетью с соединениями обратной связи, заключающими несколько слоев сети. Модель NARX основана на линейной модели ARX, которая обычно используется в моделировании timeseries.

Уравнение определения для модели NARX

y(t)=f(y(t1),y(t2),,y(tny),u(t1),u(t2),,u(tnu))

где следующее значение зависимого выходного сигнала y (t) регрессируется на предыдущих значениях выходного сигнала и предыдущих значениях независимого (внешнего) входного сигнала. Можно реализовать модель NARX при помощи нейронной сети прямого распространения, чтобы аппроксимировать функциональный f. Схему получившейся сети показывают ниже, где 2-х слойная сеть прямого распространения используется для приближения. Эта реализация также допускает векторную модель ARX, где ввод и вывод может быть многомерным.

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

Прежде, чем показать обучение сети NARX, важная настройка, которая полезна в учебном объяснении потребностей. Можно полагать, что выход сети NARX оценка выхода некоторой нелинейной динамической системы, что вы пытаетесь смоделировать. Выход возвращен к входу нейронной сети прямого распространения как часть стандартной архитектуры NARX, как показано в левом рисунке ниже. Поскольку истинный выход доступен во время обучения сети, вы могли создать последовательно-параллельную архитектуру (см. [NaPa91]), в котором истинный выход используется вместо того, чтобы возвратить предполагаемый выход, как показано в правильном рисунке ниже. Это имеет два преимущества. Прежде всего, вход к сети прямого распространения более точен. Второе - то, что получившаяся сеть имеет чистую архитектуру прямого распространения, и статическая обратная связь может использоваться для обучения.

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

Примером сети NARX является система магнитной левитации, описал начало в Использовании диспетчер NARMA-L2 Блок. Нижний график в следующем рисунке показывает, что напряжение применилось к электромагниту, и главный график показывает положение постоянного магнита. Данные были собраны в интервале выборки 0,01 секунд, чтобы сформировать два временных рядов.

Цель состоит в том, чтобы разработать модель NARX для этой системы магнитной левитации.

Во-первых, загрузите обучающие данные. Используйте коснувшиеся линии задержки с двумя задержками и входа и выхода, таким образом обучение начинается с третьей точки данных. Существует два входных параметров к последовательно-параллельной сети, u (t) последовательность и y (t) последовательность.

load magdata
y = con2seq(y);
u = con2seq(u);

Создайте последовательно-параллельную сеть NARX с помощью функции narxnet. Используйте 10 нейронов в скрытом слое и использовании trainlm для учебной функции, и затем готовят данные с preparets:

d1 = [1:2];
d2 = [1:2];
narx_net = narxnet(d1,d2,10);
narx_net.divideFcn = '';
narx_net.trainParam.min_grad = 1e-10;
[p,Pi,Ai,t] = preparets(narx_net,u,{},y);

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

narx_net = train(narx_net,p,t,Pi);

Можно теперь симулировать сеть и построить получившиеся ошибки для последовательно-параллельной реализации.

yp = sim(narx_net,p,Pi);
e = cell2mat(yp)-cell2mat(t);
plot(e)

Вы видите, что ошибки очень малы. Однако из-за последовательно-параллельной настройки, это ошибки только для предсказания "один шаг вперед". Более строгий тест должен был бы перестроить сеть в исходную параллельную форму (замкнутый цикл) и затем выполнять выполненное с помощью итераций предсказание по многим временным шагам. Теперь параллельную операцию показывают.

Существует функция тулбокса (closeloop) для преобразования NARX (и другой) сети от последовательно-параллельной настройки (разомкнутый контур), который полезен для обучения к параллельной настройке (замкнутый цикл), который полезен для многоступенчатого вперед предсказания. Следующая команда иллюстрирует, как преобразовать сеть, которую вы только обучили, чтобы быть параллельными форме:

narx_net_closed = closeloop(narx_net);

Чтобы видеть различия между этими двумя сетями, можно использовать команду представления:

view(narx_net)

view(narx_net_closed)

Все обучение сделано в разомкнутом контуре (также названный последовательно-параллельной архитектурой), включая валидацию и тестирующие шаги. Типичный рабочий процесс должен полностью создать сеть в разомкнутом контуре, и только когда это было обучено (который включает валидацию, и тестирующие шаги) преобразованный к замкнутому циклу для многоступенчатого вперед предсказания. Аналогично, R значения в графический интерфейсе пользователя вычисляются на основе результатов обучения разомкнутого контура.

Можно теперь использовать (параллельную) настройку с обратной связью, чтобы выполнить выполненное с помощью итераций предсказание 900 временных шагов. В этой сети необходимо загрузить два начальных входных параметров и два начальных выходных параметров как начальные условия. Можно использовать preparets функция, чтобы подготовить данные. Это будет использовать структуру сети, чтобы определить, как разделить и сдвинуть данные соответственно.

y1 = y(1700:2600);
u1 = u(1700:2600);
[p1,Pi1,Ai1,t1] = preparets(narx_net_closed,u1,{},y1);
yp1 = narx_net_closed(p1,Pi1,Ai1);
TS = size(t1,2);
plot(1:TS,cell2mat(t1),'b',1:TS,cell2mat(yp1),'r')

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

Для параллельного ответа (выполненное с помощью итераций предсказание), чтобы быть точным, важно, чтобы сеть была обучена так, чтобы ошибки в последовательно-параллельной настройке (предсказание "один шаг вперед") очень были малы.

Можно также создать параллель (замкнутый цикл) сеть NARX, с помощью narxnet команда с четвертым набором входного параметра к 'closed', и обучите ту сеть непосредственно. Обычно обучение занимает больше времени, и получившаяся эффективность не так хороша, как это получило с последовательно-параллельным обучением.

Каждый раз нейронная сеть обучена, может привести к различному решению из-за различного начального веса и сместить значения и различные деления данных в обучение, валидацию и наборы тестов. В результате различные нейронные сети, обученные на той же проблеме, могут дать различные выходные параметры для того же входа. Чтобы гарантировать, что нейронная сеть хорошей точности была найдена, переобучайтесь несколько раз.

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

Несколько внешних переменных

С магнитной левитацией пример показал, как моделировать временные ряды с одним внешним входным значением в зависимости от времени. Но сеть NARX будет работать на проблемы с несколькими внешними входными элементами и предсказывать ряд с несколькими элементами. В этих случаях вход и цель состоят из массивов ячейки строки, представляющих время, но с каждым элементом ячеек, являющимся N- 1 вектор для N элементы входа или целевого сигнала.

Например, вот набор данных, который состоит из внешних переменных с 2 элементами, предсказывающих ряд с 1 элементом.

[X,T] = ph_dataset;

Внешние входные параметры X отформатированы как массив ячейки строки векторов с 2 элементами, с каждым представлением вектора кислотный и основной поток решения. Цели представляют получившийся pH решения в зависимости от времени.

Можно переформатировать собственные многоэлементные серийные данные от матричной формы до формы timeseries нейронной сети с функцией con2seq.

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

net = narxnet(10);
[x,xi,ai,t] = preparets(net,X,{},T);
net = train(net,x,t,xi,ai);
y = net(x,xi,ai);
e = gsubtract(t,y); 

Чтобы видеть примеры использования сетей NARX, применяемых в многошаговом прогнозировании разомкнутой и замкнутой обратной связи, см. Многоступенчатое Предсказание Нейронной сети.