Этот пример показывает, как сделать хаотический прогноз timeseries с помощью ANFIS.
Этот пример использует anfis
, чтобы предсказать временные ряды, сгенерированные следующим дифференциальным уравнением задержки Стекла Макки (MG).
Эти временные ряды хаотичны без ясно заданного периода. Ряд не сходится или отличается, и траектория очень чувствительна к начальным условиям. Эта эталонная тестовая задача используется в нейронной сети и нечетких научных сообществах моделирования.
Чтобы получить значение временных рядов в целочисленных точках, четвертый порядок Метод Рунге-Кутта использовался, чтобы найти числовое решение предыдущего уравнения MG. Это было принято это , , и для . Результат был сохранен в файле 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 вы используете известные значения временных рядов до момента времени, , предсказать значение в какой-то момент в будущем, . Стандартный метод для этого типа прогноза состоит в том, чтобы создать отображение из точки выборочных данных, выбранные каждый модули вовремя () к предсказанному будущему значению . После обычных настроек для предсказания временных рядов MG, набора и . Для каждого , входные данные тренировки для anfis
являются четырьмя вектор-столбцами следующей формы.
Выходные данные тренировки соответствуют прогнозу траектории.
Для каждого , расположение в значениях от 118 до 1 117, существует 1 000 выборок обучения ввода/вывода. В данном примере используйте первые 500 выборок в качестве данных тренировки (trnData
) и вторые 500 значений как проверка данных для валидации (chkData
). Каждая строка обучения и проверяющий массивы данных содержит одну точку выборки, где первые четыре столбца содержат четырехмерный вход и пятая колонна содержит вывод .
Создайте обучение и проверяющий массивы данных.
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 содержит = 16 нечетких правил с 104 параметрами (24 нелинейных параметра и 80 линейных параметров). Чтобы достигнуть хорошей возможности обобщения, важно, чтобы количество данных тренировки указало быть несколько раз больше, чем оцениваемые параметры номера. В этом случае отношение между данными и параметрами - приблизительно пять (500/104), который является хорошим балансом между подгоняемыми параметрами и учебными точками выборки.
Чтобы сконфигурировать опции обучения, создайте набор опции 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 эпох. Обучение в течение дополнительных эпох может улучшить учебные результаты.