Этот пример показывает хаотическое предсказание временных рядов с использованием настроенной системы нечеткого вывода (FIS) типа 2. Этот пример настраивает FIS, используя оптимизацию роя частиц, которая требует программного обеспечения Global Optimization Toolbox™.
Этот пример моделирует данные timeseries с использованием следующей формы нелинейного дифференциального уравнения Макки-Стекла (MG).
Симулируйте временные ряды для 1200 выборок с помощью следующего строения.
Шаг расчета секунда
Начальное условие
для .
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 для предсказания следующего значения.
Создайте 1000 наборов входных/выходных данных из выборок кому
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,:);
Этот пример использует FIS Sugeno 2 типа. Поскольку Sugeno FIS имеет меньше настраиваемых параметров, чем Mamdani FIS, система Sugeno обычно сходится быстрее во время оптимизации.
fisin = sugfistype2;
Добавьте три входов с тремя функциями треугольного членства (MF) по умолчанию. Первоначально устраните площадь неопределенности (FOU) для каждого входного MF путем установки каждой нижней MF равной ее соответствующей верхней MF. Для этого установите значения шкалы и задержки каждого нижнего МФ равными 1
и 0
, соответственно. Исключив FOU для всех функций членства в входе, вы конфигурируете FIS типа 2 так, чтобы вести себя как FIS типа 1.
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. Выходы содержат функции постоянного членства по умолчанию. Чтобы обеспечить максимальное разрешение для отображения вход-выход, установите количество выхода MF, равное количеству входа комбинаций MF.
numOutputMFs = numInputMFs^numInputs;
fisin = addOutput(fisin,range,'NumMFs',numOutputMFs);
Просмотрите структуру FIS. Изначально FIS имеет нулевые правила. Правила системы находятся в процессе настройки.
plotfis(fisin)
Для настройки FIS используются следующие три шага.
Изучение основы правила при сохранении входа и выходных параметров MF постоянными.
Настройте выходные параметры MF и верхние параметры MF входов, сохраняя правило и более низкие параметры MF постоянными.
Настройте нижние параметры MF входов, сохраняя правило, выход MF и верхние параметры MF постоянными.
Первый шаг является менее в вычислительном отношении дорогим из-за небольшого количества параметров правила, и он быстро сходится к основе правил во время обучения. После второго шага система является обученным FIS типа 1. Третий этап создает настроенный FIS типа 2.
Чтобы узнать основу правил, сначала задайте опции настройки с помощью 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)
Настройте параметры верхней функции принадлежности. Sugeno FIS типа 2 поддерживает только четкие выходные функции. Поэтому этот шаг настраивает входные верхние MF и четкие выходные функции.
Получите входы и выходных параметров с помощью getTunableSettings
. Поскольку FIS использует треугольные входные MF, можно настроить входные MF используя асимметричные значения задержки.
[in,out] = getTunableSettings(fisout1,'AsymmetricLag',true);
Отключите настройку параметров нижнего МФ.
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. Этот результат эквивалентен настройке FIS типа 1.
Настройка только входных параметров более низкого 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 включает как настроенные верхние, так и более низкие значения параметров.
Type-2 MF обеспечивают дополнительные настраиваемые параметры по сравнению с MF типа 1. Поэтому при наличии адекватных обучающих данных настроенный FIS типа 2 может соответствовать обучающим данным лучше, чем настроенный FIS типа 1.
В целом можно получить различные результаты настройки путем изменения любого из следующих свойств FIS или опций настройки:
Количество входов
Количество MF
Тип MF
Метод оптимизации
Количество итераций настройки
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