Этот пример показывает хаотический прогноз временных рядов с помощью настроенной нечеткой системы вывода (FIS) типа 2. Этот пример настраивает FIS использование оптимизации роя частицы, которая требует программного обеспечения Global Optimization Toolbox™.
Этот пример симулирует данные временных рядов с помощью следующей формы Стекла Макки (MG) нелинейное дифференциальное уравнение с запаздывающим аргументом.
Симулируйте временные ряды для 1 200 выборок с помощью следующей настройки:
'SampleTime' секунда
Начальное условие
для .
ts = 1; numSamples = 1200; tau = 20; x = zeros(1,numSamples+tau+1); x(tau+1) = 1.2; for t = 1+tau:numSamples+tau x_dot = 0.2*x(t-tau)/(1+(x(t-tau))^10)-0.1*x(t); x(t+1) = x(t) + ts*x_dot; end
Отобразите симулированные данные timeseries MG на графике.
figure(1) plot(x(tau+2:end)) title('Mackey-Glass Chaotic Time Series') xlabel('Time (sec)') ylabel('x(t)')
Прогноз timeseries использует известные значения timeseries до времени t, чтобы предсказать будущее значение во время . Стандартный метод для этого типа прогноза состоит в том, чтобы создать отображение из точек выборочных данных D, произведенных каждый Δ модули вовремя () к предсказанному будущему значению . В данном примере набор и . Следовательно, для каждого t, обучающие наборы данных ввода и вывода и , соответственно. Другими словами, используйте четыре последовательных известных значения timeseries, чтобы предсказать следующее значение.
Создайте 1 000 наборов данных ввода/вывода из выборок к
D = 4; inputData = zeros(1000,D); outputData = zeros(1000,1); for t = 100+D-1:1100+D-2 for i = 1:D inputData(t-100-D+2,i) = x(t-D+i); end outputData(t-100-D+2,:) = x(t+1); end
Используйте первые 500 наборов данных в качестве обучающих данных (trnX
и trnY
) и вторые 500 наборов как данные о валидации (vldX
и vldY
).
trnX = inputData(1:500,:); trnY = outputData(1:500,:); vldX = inputData(501:end,:); vldY = outputData(501:end,:);
Этот пример использует тип 2 Sugeno FIS. Поскольку Sugeno FIS имеет меньше настраиваемых параметров, чем Mamdani FIS, система Sugeno обычно сходится быстрее во время оптимизации.
fisin = sugfistype2;
Добавьте три входных параметров, каждого с тремя треугольными функциями принадлежности по умолчанию (MFS). Первоначально, устраните место неопределенности (FOU) для каждого входа MF путем установки каждого более низкого MF, равного его соответствующему верхнему MF. Для этого установите шкалу и значения задержки каждого более низкого MF к 1
и 0
, соответственно. Путем устранения FOU для всех входных функций принадлежности вы конфигурируете тип 2 FIS, чтобы вести себя как тип 1 FIS.
numInputs = D; numInputMFs = 3; range = [min(x) max(x)]; for i = 1:numInputs fisin = addInput(fisin,range,'NumMFs',numInputMFs); for j = 1:numInputMFs fisin.Inputs(i).MembershipFunctions(j).LowerScale = 1; fisin.Inputs(i).MembershipFunctions(j).LowerLag = 0; end end
Для прогноза добавьте выход в FIS. Выход содержит постоянные функции принадлежности по умолчанию. Чтобы обеспечить максимальное разрешение для отображения ввода - вывода, определите номер выхода MFs, равного количеству комбинаций входа MF.
numOutputMFs = numInputMFs^numInputs;
fisin = addOutput(fisin,range,'NumMFs',numOutputMFs);
Просмотрите структуру FIS. Первоначально, FIS имеет нулевые правила. Правила системы найдены во время настраивающего процесса.
plotfis(fisin)
Чтобы настроить FIS, вы используете выполняющий трех шагов.
Изучите основу правила при хранении параметров MF ввода и вывода постоянными.
Настройте параметры выхода MF и верхние параметры MF входных параметров при хранении правила и более низких параметров MF постоянными.
Настройте более низкие параметры MF входных параметров при хранении правила, выхода MF и верхних параметров MF постоянными.
Первый шаг является менее в вычислительном отношении дорогим из-за небольшого количества параметров правила, и это быстро сходится к нечеткой основе правила во время обучения. После второго шага система является обученным типом 1 FIS. Третий шаг производит настроенный тип 2 FIS.
Чтобы изучить основу правила, сначала задайте настраивающиеся опции с помощью tunefisOptions
объект.
options = tunefisOptions;
Поскольку FIS не содержит предварительно настроенных нечетких правил, использует глобальный метод оптимизации (генетический алгоритм или рой частицы), чтобы изучить правила. Глобальные методы оптимизации выполняют лучше в больших диапазонах настройки параметра по сравнению с локальными методами оптимизации (поиск шаблона и симулированный отжиг). В данном примере настройте FIS использование оптимизации роя частицы ('particleswarm'
).
options.Method = 'particleswarm';
Чтобы изучить новые правила, установите OptimizationType
к 'learning'
.
options.OptimizationType = 'learning';
Ограничьте максимальное количество правил к количеству комбинаций входа MF. Количество настроенных правил может быть меньше этого предела, поскольку настраивающий процесс удаляет дублирующиеся правила.
options.NumMaxRules = numInputMFs^numInputs;
Если у вас есть программное обеспечение Parallel Computing Toolbox™, можно улучшить скорость настраивающего процесса установкой UseParallel
к true
. Если у вас нет программного обеспечения Parallel Computing Toolbox, установите UseParallel
к false
.
options.UseParallel = false;
Определите максимальный номер итераций к 10
. Увеличение числа итераций может уменьшать учебную ошибку. Однако большее число итераций увеличивает длительность настраивающего процесса и может сверхнастроить параметры правила на обучающие данные.
options.MethodOptions.MaxIterations = 10;
Поскольку оптимизация роя частицы использует случайный поиск, чтобы получить восстанавливаемые результаты, инициализировать генератор случайных чисел к его настройке по умолчанию.
rng('default')
Настройка FIS использование tunefis
функционируйте занимает несколько минут. В данном примере позвольте настроиться установкой runtunefis
к true
. Загружать предварительно обученные результаты, не запуская tunefis
, можно установить runtunefis
к false
.
runtunefis = false;
Настройте FIS использование заданных обучающих данных и опций.
if runtunefis fisout1 = tunefis(fisin,[],trnX,trnY,options); else tunedfis = load('tunedfischaotictimeseriestype2.mat'); fisout1 = tunedfis.fisout1; end
Просмотрите структуру обученного FIS, который содержит новые изученные правила.
plotfis(fisout1)
Проверяйте отдельные отношения ввода - вывода, настроенные изученной базой правил. Например, следующий рисунок показывает отношение между вторым входом и выходом.
gensurf(fisout1,gensurfOptions('InputIndex',2))
Оцените настроенный FIS использование данных о контроле ввода. Постройте фактический сгенерированный выход с ожидаемой валидацией выход и вычислите среднеквадратичную ошибку (RMSE).
plotActualAndExpectedResultsWithRMSE(fisout1,vldX,vldY)
Настройте верхние параметры функции принадлежности. Тип 2 Sugeno FIS поддерживает только четкие выходные функции. Поэтому этот шаг мелодии ввел верхний MFS и четкие выходные функции.
Получите установки параметров ввода и вывода с помощью getTunableSettings
. Поскольку FIS использует треугольный вход MFs, можно настроить вход MFs с помощью асимметричных значений задержки.
[in,out] = getTunableSettings(fisout1,'AsymmetricLag',true);
Отключите настройку более низких параметров MF.
for i = 1:length(in) for j = 1:length(in(i).MembershipFunctions) in(i).MembershipFunctions(j).LowerScale.Free = false; in(i).MembershipFunctions(j).LowerLag.Free = false; end end
Оптимизировать существующие настраиваемые параметры MF при хранении базы правил постоянной, набор OptimizationType
к 'tuning'
.
options.OptimizationType = 'tuning';
Настройте FIS использование заданных настраивающих данных и опций. Загружать предварительно обученные результаты, не запуская tunefis
, можно установить runtunefis
к false
.
rng('default') if runtunefis fisout2 = tunefis(fisout1,[in;out],trnX,trnY,options); else tunedfis = load('tunedfischaotictimeseriestype2.mat'); fisout2 = tunedfis.fisout2; end
Просмотрите структуру обученного FIS, который теперь содержит настроенные верхние параметры MF.
plotfis(fisout2)
Оцените настроенный FIS использование данных о валидации, вычислите RMSE и постройте фактический сгенерированный выход с ожидаемой валидацией выход.
plotActualAndExpectedResultsWithRMSE(fisout2,vldX,vldY)
Настройка верхних параметров MF улучшает производительность FIS. Этот результат эквивалентен настройке типа 1 FIS.
Настройте только вход более низкие параметры MF. Для этого установите более низкую шкалу и настраиваемые значения задержки, и отключите настройку верхних параметров MF.
for i = 1:length(in) for j = 1:length(in(i).MembershipFunctions) in(i).MembershipFunctions(j).UpperParameters.Free = false; in(i).MembershipFunctions(j).LowerScale.Free = true; in(i).MembershipFunctions(j).LowerLag.Free = true; end end
Настройте FIS использование заданных настраивающих данных и опций. Загружать предварительно обученные результаты, не запуская tunefis
, можно установить runtunefis
к false
.
rng('default') if runtunefis fisout3 = tunefis(fisout2,in,trnX,trnY,options); else tunedfis = load('tunedfischaotictimeseriestype2.mat'); fisout3 = tunedfis.fisout3; end
Просмотрите структуру обученного FIS, который теперь содержит настроенные более низкие параметры MF.
plotfis(fisout3)
Оцените настроенный FIS использование данных о валидации, вычислите RMSE и постройте фактический сгенерированный выход с ожидаемой валидацией выход.
plotActualAndExpectedResultsWithRMSE(fisout3,vldX,vldY)
Настройка обоих верхние и более низкие значения MF улучшает производительность FIS. RMSE улучшается, когда обученный FIS включает и настроил верхний и понизил значения параметров.
Тип 2 MFS обеспечивает дополнительные настраиваемые параметры, как сравнено с MFS типа 1. Поэтому с данными о надлежащей подготовке, настроенный тип 2 FIS может соответствовать обучающим данным лучше, чем настроенный тип 1 FIS.
В целом, можно привести к различным настраивающим результатам путем изменения любого из следующих свойств FIS или настройки опций:
Количество входных параметров
Количество MFS
Тип MFS
Метод оптимизации
Количество настраивающихся итераций
function [rmse,actY] = calculateRMSE(fis,x,y) % Specify options for FIS evaluation evalOptions = evalfisOptions("EmptyOutputFuzzySetMessage","none", ... "NoRuleFiredMessage","none","OutOfRangeInputValueMessage","none"); % Evaluate FIS actY = evalfis(fis,x,evalOptions); % Calculate RMSE del = actY - y; rmse = sqrt(mean(del.^2)); end function plotActualAndExpectedResultsWithRMSE(fis,vldX,vldY) [rmse,actY] = calculateRMSE(fis,vldX,vldY); figure plot([actY vldY]) axis([0 length(vldY) min(vldY)-0.01 max(vldY)+0.13]) xlabel('sample index') ylabel('signal value') title(['RMSE = ' num2str(rmse)]) legend(["Actual output" "Expected output"],'Location',"northeast") end