Предскажите Хаотический Timeseries с помощью ANFIS

Этот пример показывает, как сделать хаотический прогноз timeseries с помощью ANFIS.

Данные временных рядов

Этот пример использует anfis, чтобы предсказать временные ряды, сгенерированные следующим дифференциальным уравнением задержки Стекла Макки (MG).

x˙(t)=0.2x(t-τ)1+x10(t-τ)=0.1x(t)

Эти временные ряды хаотичны без ясно заданного периода. Ряд не сходится или отличается, и траектория очень чувствительна к начальным условиям. Эта эталонная тестовая задача используется в нейронной сети и нечетких научных сообществах моделирования.

Чтобы получить значение временных рядов в целочисленных точках, четвертый порядок Метод Рунге-Кутта использовался, чтобы найти числовое решение предыдущего уравнения MG. Это было принято это x(0)=1.2, τ=17, и x(t)=0 для t<0. Результат был сохранен в файле mgdata.dat.

Загрузите и постройте временные ряды MG.

load mgdata.dat
time = mgdata(:,1);
x = mgdata(:, 2);
figure(1)
plot(time,x)
title('Mackey-Glass Chaotic Time Series')
xlabel('Time (sec)')
ylabel('x(t)')

Предварительно обработайте данные

В прогнозе timeseries вы используете известные значения временных рядов до момента времени, t, предсказать значение в какой-то момент в будущем, t+P. Стандартный метод для этого типа прогноза состоит в том, чтобы создать отображение из D точки выборочных данных, выбранные каждый Δ модули вовремя (x(t-(D-1)Δ),,x(t-Δ),x(t)) к предсказанному будущему значению x=(t+P). После обычных настроек для предсказания временных рядов MG, набора D=4 и Δ=P=6. Для каждого t, входные данные тренировки для anfis являются четырьмя вектор-столбцами следующей формы.

w(t)=[x(t-19),x(t-12),x(t-6),x(t)]

Выходные данные тренировки соответствуют прогнозу траектории.

s(t)=x(t+6)

Для каждого t, расположение в значениях от 118 до 1 117, существует 1 000 выборок обучения ввода/вывода. В данном примере используйте первые 500 выборок в качестве данных тренировки (trnData) и вторые 500 значений как проверка данных для валидации (chkData). Каждая строка обучения и проверяющий массивы данных содержит одну точку выборки, где первые четыре столбца содержат четырехмерный вход w и пятая колонна содержит вывод s.

Создайте обучение и проверяющий массивы данных.

for t = 118:1117 
    Data(t-117,:) = [x(t-18) x(t-12) x(t-6) x(t) x(t+6)]; 
end
trnData = Data(1:500,:);
chkData = Data(501:end,:);

Создайте начальную нечеткую систему

Создайте начальный объект Sugeno FIS для обучения с помощью функции genfis с разделением сетки.

fis = genfis(trnData(:,1:end-1),trnData(:,end),...
    genfisOptions('GridPartition'));

Количество вводов и выводов FIS соответствует количеству столбцов в данных тренировки ввода и вывода, четыре и один, соответственно.

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

figure
subplot(2,2,1)
plotmf(fis,'input',1)
subplot(2,2,2)
plotmf(fis,'input',2)
subplot(2,2,3)
plotmf(fis,'input',3)
subplot(2,2,4)
plotmf(fis,'input',4)

Сгенерированный объект FIS содержит 24 = 16 нечетких правил с 104 параметрами (24 нелинейных параметра и 80 линейных параметров). Чтобы достигнуть хорошей возможности обобщения, важно, чтобы количество данных тренировки указало быть несколько раз больше, чем оцениваемые параметры номера. В этом случае отношение между данными и параметрами - приблизительно пять (500/104), который является хорошим балансом между подгоняемыми параметрами и учебными точками выборки.

Обучите модель ANFIS

Чтобы сконфигурировать опции обучения, создайте набор опции anfisOptions, задав начальный FIS и данные о валидации.

options = anfisOptions('InitialFIS',fis,'ValidationData',chkData);

Обучите FIS использование заданных данных тренировки и опций.

[fis1,error1,ss,fis2,error2] = anfis(trnData,options);
ANFIS info: 
	Number of nodes: 55
	Number of linear parameters: 80
	Number of nonlinear parameters: 24
	Total number of parameters: 104
	Number of training data pairs: 500
	Number of checking data pairs: 500
	Number of fuzzy rules: 16


Start training ANFIS ...

   1 	 0.00296046 	 0.00292488
   2 	 0.00290346 	 0.0028684
   3 	 0.00285048 	 0.00281544
   4 	 0.00280117 	 0.00276566
   5 	 0.00275517 	 0.00271874
Step size increases to 0.011000 after epoch 5.
   6 	 0.00271214 	 0.00267438
   7 	 0.00266783 	 0.00262818
   8 	 0.00262626 	 0.00258435
   9 	 0.00258702 	 0.00254254
Step size increases to 0.012100 after epoch 9.
  10 	 0.00254972 	 0.00250247

Designated epoch number reached --> ANFIS training completed at epoch 10.

Minimal training RMSE = 0.002550
Minimal checking RMSE = 0.00250247

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

Строит функции принадлежности для обученной системы.

figure
subplot(2,2,1)
plotmf(fis2,'input',1)
subplot(2,2,2)
plotmf(fis2,'input',2)
subplot(2,2,3)
plotmf(fis2,'input',3)
subplot(2,2,4)
plotmf(fis2,'input',4)

Постройте ошибочные кривые

Постройте обучение и проверяющий сигналы ошибки.

figure
plot([error1 error2])
hold on
plot([error1 error2],'o')
legend('Training error','Checking error')
xlabel('Epochs')
ylabel('Root Mean Squared Error')
title('Error Curves')

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

Сравните исходный и предсказанный ряд

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

anfis_output = evalfis(fis2,[trnData(:,1:4); chkData(:,1:4)]);

figure
index = 125:1124;
plot(time(index),[x(index) anfis_output])
xlabel('Time (sec)')
title('MG Time Series and ANFIS Prediction')

Предсказанный ряд подобен исходному ряду.

Вычислите и постройте ошибку прогноза.

diff = x(index) - anfis_output;
plot(time(index),diff)
xlabel('Time (sec)')
title('Prediction Errors')

Шкала диаграммы погрешностей прогноза о сотой из шкалы графика timeseries. В этом примере вы обучили систему в течение только 10 эпох. Обучение в течение дополнительных эпох может улучшить учебные результаты.

Смотрите также

| |

Похожие темы