В этом примере показано хаотичное прогнозирование временных рядов с использованием настроенной системы нечеткого вывода типа 2 (FIS). В этом примере FIS настраивается с использованием оптимизации роя частиц, которая требует программного обеспечения Global Optimization Toolbox™.
В этом примере моделируются данные временных рядов с использованием следующей формы нелинейного дифференциального уравнения задержки Макки-Гласса (MG).
-
Смоделировать временные ряды для 1200 выборок с использованием следующей конфигурации.
Время выборки 1 с
Исходное условие 1,2
=0 <τ.
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
Постройте график смоделированных временных рядов MG.
figure(1) plot(x(tau+2:end)) title('Mackey-Glass Chaotic Time Series') xlabel('Time (sec)') ylabel('x(t)')

Предсказание временных рядов использует известные значения временных рядов вплоть до времени t для предсказания будущего значения в момент времени P. Стандартный метод для этого типа прогнозирования заключается в создании отображения из D точек данных выборки, дискретизированных через каждые Δ единиц во времени t-Δ), x (t)) к прогнозируемому значению x = (t + P). Для примера задайте D = 4 и Δ = P = 1. Следовательно, для каждого t входными и выходными t-3), x , x (t-1), x (t)] и x (t + 1) соответственно. Другими словами, используйте четыре последовательных известных значения временных рядов для прогнозирования следующего значения.
Создайте 1000 наборов входных/выходных данных из выборок D-1) D-2).
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. Поскольку FIS Sugeno имеет меньше настраиваемых параметров, чем FIS Mamdani, система Sugeno обычно сходится быстрее во время оптимизации.
fisin = sugfistype2;
Добавьте три входа, каждый с тремя треугольными функциями членства по умолчанию (MF). Сначала устраните след неопределенности (FOU) для каждого входного MF, установив каждый нижний 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)

Настройте параметры верхней функции членства. FIS Sugeno типа 2 поддерживает только четкие функции вывода. Поэтому на этом шаге настраиваются входные верхние MF-функции и функции быстрого вывода.
Получение параметров ввода и вывода с помощью getTunableSettings. Поскольку FIS использует треугольные входные MF, можно настроить входные MF с помощью асимметричных значений запаздывания.
[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. Этот результат эквивалентен настройке 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