В этом примере показано, как настроить функцию членства (MF) и параметры правил системы нечеткого вывода Мамдани (FIS). В этом примере используется оптимизация роя частиц и поиска шаблона, для которой требуется программное обеспечение Global Optimization Toolbox™.
Прогнозирование потребления автомобильного топлива в милях на галлон (MPG) является типичной проблемой нелинейной регрессии. Для прогнозирования расхода топлива используется несколько атрибутов профиля автомобиля. Данные обучения имеются в репозитории машинного обучения Университета Калифорнии в Ирвайне и содержат данные, собранные с автомобилей различных марок и моделей.
В этом примере для прогнозирования атрибута выходных данных MPG с FIS используются следующие шесть атрибутов входных данных:
Количество баллонов
Смещение
Лошадиная сила
Вес
Ускорение
Модельный год
Загрузите данные. Каждая строка набора данных, полученная из репозитория, представляет собой отдельный профиль автомобиля.
[data,name] = loadGasData;
Удалите начальные и конечные пробелы из имен атрибутов.
name = strtrim(string(name));
data содержит 7 столбцов, где первые шесть столбцов содержат следующие входные атрибуты.
Количество баллонов
Смещение
Лошадиная сила
Вес
Ускорение
Модельный год
Седьмой столбец содержит атрибут вывода MPG.
создание отдельных наборов входных и выходных данных; X и Yсоответственно.
X = data(:,1:6); Y = data(:,7);
Разбиение наборов входных и выходных данных на учебные данные (нечетно-индексированные выборки) и данные проверки (четно-индексированные выборки).
trnX = X(1:2:end,:); % Training input data set trnY = Y(1:2:end,:); % Training output data set vldX = X(2:2:end,:); % Validation input data set vldY = Y(2:2:end,:); % Validation output data set
Извлеките диапазон каждого атрибута данных, который будет использоваться для определения диапазона ввода/вывода во время построения FIS.
dataRange = [min(data)' max(data)'];
Создайте FIS Mamdani для настройки.
fisin = mamfis;
Добавьте входные и выходные переменные в FIS, где каждая переменная представляет один из атрибутов данных. Для каждой переменной используйте соответствующее имя атрибута и диапазон.
Чтобы уменьшить количество правил, используйте два MF для каждой входной переменной, что приводит к 64 входным комбинациям MF. Поэтому FIS использует максимум 64 правила, соответствующих входным комбинациям MF.
Для улучшения обобщения данных, выходящих за рамки обучающих данных, используйте 64 MF для выходной переменной. Это позволяет FIS использовать различные выходные MF для каждого правила.
Как входные, так и выходные переменные используют треугольные MF по умолчанию, которые равномерно распределены по диапазонам переменных.
for i = 1:6 fisin = addInput(fisin,dataRange(i,:),'Name',name(i),'NumMFs',2); end fisin = addOutput(fisin,dataRange(7,:),'Name',name(7),'NumMFs',64);
Просмотрите структуру FIS. Изначально FIS имеет нулевые правила. Правила системы находятся в процессе настройки.
figure plotfis(fisin)

Настройка выполняется в два этапа.
Изучение базы правил при сохранении параметров ввода и вывода MF постоянными.
Настройте параметры MF и правил ввода/вывода.
Первый шаг менее затратен в вычислительном отношении из-за небольшого количества параметров правила, и он быстро сходится к нечеткой базе правил во время обучения. На втором этапе использование базы правил с первого шага в качестве начального условия обеспечивает быструю сходимость процесса настройки параметров.
Изучение правил
Чтобы узнать базу правил, сначала задайте параметры настройки с помощью tunefisOptions объект. Поскольку FIS допускает большое количество выходных MF (используемых в последующих правилах), используйте метод глобальной оптимизации (генетический алгоритм или рой частиц). Такие способы работают лучше в больших диапазонах настройки параметров по сравнению с локальными методами оптимизации (поиск шаблона и имитационный отжиг). Для этого примера настройте FIS с помощью метода оптимизации роя частиц ('particleswarm').
Чтобы узнать новые правила, установите OptimizationType кому 'learning'. Ограничьте максимальное количество правил 64. Число настроенных правил может быть меньше этого предела, поскольку процесс настройки удаляет повторяющиеся правила.
options = tunefisOptions('Method','particleswarm',... 'OptimizationType','learning', ... 'NumMaxRules',64);
При наличии программного обеспечения Parallel Computing Toolbox™ можно повысить скорость процесса настройки, задав options.UseParallel кому true. Если у вас нет программного обеспечения Parallel Computing Toolbox, установите options.UseParallel кому false.
Установите максимальное число итераций равным 20. Чтобы уменьшить ошибки обучения в процессе обучения правилам, можно увеличить число итераций. Однако использование слишком большого количества итераций может перестраивать FIS на данные обучения, увеличивая ошибки проверки.
options.MethodOptions.MaxIterations = 20;
Поскольку оптимизация роя частиц использует случайный поиск, для получения воспроизводимых результатов инициализируйте генератор случайных чисел в его конфигурацию по умолчанию.
rng('default')Настройте FIS, используя указанные данные настройки и параметры.
Правила обучения с использованием tunefis функция занимает приблизительно 5 минут. В этом примере включите настройку с помощью параметра runtunefis кому true. Загрузка предварительно подготовленных результатов без выполнения tunefis, можно установить runtunefis кому false.
runtunefis = false;
Параметры могут быть пустыми при изучении новых правил. Дополнительные сведения см. в разделе tunefis.
if runtunefis fisout1 = tunefis(fisin,[],trnX,trnY,options); %#ok<UNRCH> else tunedfis = load('tunedfismpgprediction.mat'); fisout1 = tunedfis.fisout1; fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisout1,trnX,trnY)); end
Training RMSE = 4.452 MPG
Best f(x) столбец показывает обучающую корневую среднеквадратичную ошибку (RMSE).
Просмотр структуры настроенной FIS, fisout1.
plotfis(fisout1)

Процесс обучения дает набор новых правил для FIS. Например, просмотрите описания первых трех правил.
[fisout1.Rules(1:3).Description]'
ans = 3x1 string
"Cylinder==mf2 & Disp==mf2 & Power==mf2 & Weight==mf2 & Year==mf2 => MPG=mf5 (1)"
"Cylinder==mf1 & Power==mf2 & Weight==mf2 & Acceler==mf2 & Year==mf1 => MPG=mf63 (1)"
"Cylinder==mf2 & Disp==mf1 & Acceler==mf2 => MPG=mf28 (1)"
Наученная система должна иметь одинаковую производительность RMSE для наборов данных обучения и проверки. Чтобы вычислить RMSE для набора данных проверки, проанализируйте fisout1 использование набора входных данных проверки vldX. Чтобы скрыть предупреждения во время выполнения во время оценки, установите для всех параметров предупреждения значение none.
Вычисление RMSE между сгенерированными выходными данными и набором выходных данных проверки vldY.
plotActualAndExpectedResultsWithRMSE(fisout1,vldX,vldY)

Поскольку ошибки обучения и проверки аналогичны, изученная система не переопределяет данные обучения.
Настройка всех параметров
Изучив новые правила, настройте параметры MF ввода/вывода вместе с параметрами изученных правил. Для получения настраиваемых параметров FIS используйте getTunableSettings функция.
[in,out,rule] = getTunableSettings(fisout1);
Чтобы настроить существующие параметры FIS без изучения новых правил, установите OptimizationType кому 'tuning'.
options.OptimizationType = 'tuning';Поскольку FIS уже изучил правила с использованием обучающих данных, используйте метод локальной оптимизации для быстрой конвергенции значений параметров. Для этого примера используйте метод оптимизации поиска шаблона ('patternsearch').
options.Method = 'patternsearch';Настройка параметров FIS занимает больше итераций, чем предыдущий шаг обучения правилам. Поэтому увеличьте максимальное количество итераций процесса настройки до 60. Как и на первом этапе настройки, можно уменьшить ошибки обучения, увеличив количество итераций. Однако использование слишком большого количества итераций может перестраивать параметры на данные обучения, увеличивая количество ошибок проверки.
options.MethodOptions.MaxIterations = 60;
Чтобы улучшить результаты поиска массива, задайте параметр метода UseCompletePoll к true.
options.MethodOptions.UseCompletePoll = true;
Настройка параметров FIS с использованием заданных настраиваемых настроек, данных обучения и параметров настройки.
Настройка значений параметров с помощью tunefis функция занимает приблизительно 5 минут. Загрузка предварительно подготовленных результатов без выполнения tunefis, можно установить runtunefis кому false.
if runtunefis rng('default') %#ok<UNRCH> fisout = tunefis(fisout1,[in;out;rule],trnX,trnY,options); else fisout = tunedfis.fisout; fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisout,trnX,trnY)); end
Training RMSE = 2.903 MPG
В конце процесса настройки некоторые настроенные MF-фигуры отличаются от исходных.
figure plotfis(fisout)

Проверка производительности настроенной FIS, fisout, используя набор входных данных проверки vldX.
Сравнение ожидаемого MPG, полученного из набора выходных данных проверки vldY и фактический MPG, сгенерированный с помощью fisout. Вычислите RMSE между этими результатами.
plotActualAndExpectedResultsWithRMSE(fisout,vldX,vldY);

Настройка параметров FIS улучшает RMSE по сравнению с результатами из исходной усвоенной базы правил. Поскольку ошибки обучения и проверки аналогичны, значения параметров не перестраиваются.
Дополнительно можно улучшить ошибку обучения настроенного FIS, выполнив следующие действия:
Увеличение числа итераций на этапах обучения правилам и настройки параметров. Это увеличивает продолжительность процесса оптимизации, а также может увеличить ошибку проверки из-за избыточной настройки системных параметров с данными обучения.
Использование методов глобальной оптимизации, таких как ga и particleswarmкак на этапах обучения правилам, так и на этапах настройки параметров. ga и particleswarm более высокая производительность для больших диапазонов настройки параметров, поскольку они являются глобальными оптимизаторами. С другой стороны, patternsearch и simulannealbnd лучше работать для небольших диапазонов параметров, поскольку они являются локальными оптимизаторами. Если FIS генерируется на основе данных обучения с genfis или база правил уже добавлена в FIS с использованием данных обучения, то patternsearch и simulannealbnd может привести к более быстрой сходимости по сравнению с ga и particleswarm. Дополнительные сведения об этих методах оптимизации и их параметрах см. в разделе ga (инструментарий глобальной оптимизации), particleswarm (инструментарий глобальной оптимизации), patternsearch(Панель инструментов глобальной оптимизации), и simulannealbnd(Панель инструментов глобальной оптимизации).
Изменение свойств FIS, таких как тип FIS, количество входов, количество входов/выходов MF, типы MF и количество правил. Для нечетких систем с большим количеством входов FIS Sugeno обычно сходится быстрее, чем FIS Mamdani, поскольку система Sugeno имеет меньшее количество выходных параметров MF (если constant Используются MF) и более быстрая дефузификация. Небольшое количество MF и правил сокращает количество настраиваемых параметров, обеспечивая более быстрый процесс настройки. Кроме того, большое количество правил может превысить данные обучения. В целом, для более крупных нечетких систем дерево FIS может обеспечивать аналогичную производительность при меньшем количестве правил по сравнению с одним FIS. Пример см. в разделе Настройка дерева FIS для прогнозирования пробега газа.
Изменение настраиваемых параметров для MF и правил. Например, можно настроить опору треугольной MF без изменения ее положения пика. Это сокращает количество настраиваемых параметров и позволяет ускорить процесс настройки для конкретных приложений. Для правил можно исключить нулевые индексы MF, установив AllowEmpty настраиваемый параметр для false, что уменьшает общее количество правил на этапе обучения.
function plotActualAndExpectedResultsWithRMSE(fis,x,y) % Calculate RMSE bewteen actual and expected results [rmse,actY] = calculateRMSE(fis,x,y); % Plot results figure subplot(2,1,1) hold on bar(actY) bar(y) bar(min(actY,y),'FaceColor',[0.5 0.5 0.5]) hold off axis([0 200 0 60]) xlabel("Validation input dataset index"),ylabel("MPG") legend(["Actual MPG" "Expected MPG" "Minimum of actual and expected values"],... 'Location','NorthWest') title("RMSE = " + num2str(rmse) + " MPG") subplot(2,1,2) bar(actY-y) xlabel("Validation input dataset index"),ylabel("Error (MPG)") title("Difference Between Actual and Expected Values") end function [rmse,actY] = calculateRMSE(fis,x,y) % Specify options for FIS evaluation persistent evalOptions if isempty(evalOptions) evalOptions = evalfisOptions("EmptyOutputFuzzySetMessage","none", ... "NoRuleFiredMessage","none","OutOfRangeInputValueMessage","none"); end % Evaluate FIS actY = evalfis(fis,x,evalOptions); % Calculate RMSE del = actY - y; rmse = sqrt(mean(del.^2)); end
genfis | getTunableSettings | tunefis