Этот пример показывает, как сделать хаотическое предсказание 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 до 1117, существует 1000 входных/выходных обучающих выборок. В данном примере используйте первые 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 Step size increases to 0.011000 after epoch 5. 5 0.00275517 0.00271874 6 0.00271214 0.00267438 7 0.00266783 0.00262818 8 0.00262626 0.00258435 Step size increases to 0.012100 after epoch 9. 9 0.00258702 0.00254254 10 0.00254972 0.00250247 Designated epoch number reached. ANFIS training completed at epoch 10. Minimal training RMSE = 0.00254972 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 эпох. Обучение для дополнительных эпох может улучшить результаты обучения.