В этом примере показано, как настроить функцию принадлежности (MF) и параметры правила нечеткой системы вывода (FIS) Mamdani. Этот пример использует рой частицы и оптимизацию поиска шаблона, которые требуют программного обеспечения Global Optimization Toolbox™.
Автомобильный прогноз расхода топлива в милях на галлон (MPG) является типичной нелинейной проблемой регрессии. Это использует несколько автомобильных атрибутов профиля, чтобы предсказать расход топлива. Обучающие данные доступны в Калифорнийском университете в Репозитории Машинного обучения Ирвина и содержат данные, собранные от автомобилей различных, делает и модели.
Этот пример использует следующие шесть атрибутов входных данных, чтобы предсказать, что выходные данные приписывают MPG с FIS:
Количество цилиндров
Смещение
Лошадиная сила
Вес
Ускорение
Модельный год
Загрузите данные. Каждая строка набора данных, полученного из репозитория, представляет различный автомобильный профиль.
[data,name] = loadgas;
Удалите ведущий и запаздывающий пробел из названий атрибута.
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)'];
Создайте Mamdani FIS для настройки.
fisin = mamfis;
Добавьте переменные ввода и вывода в FIS, где каждая переменная представляет один из атрибутов данных. Для каждой переменной используйте соответствующее название атрибута и область значений.
Чтобы сократить количество правил, используйте два MFS в каждой входной переменной, которая приводит к комбинации входа MF. Поэтому FIS использует максимум 64 правил, соответствующих комбинациям входа MF.
Чтобы улучшить обобщение данных вне обучающих данных, используйте 64 MFS в выходной переменной. Выполнение так позволяет FIS использовать различный выход MF в каждом правиле.
Обе переменные ввода и вывода используют треугольный MFS по умолчанию, которые равномерно распределены по переменным диапазонам.
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 ввода и вывода постоянными.
Настройте параметры MFS ввода/вывода и правил.
Первый шаг является менее в вычислительном отношении дорогим из-за небольшого количества параметров правила, и это быстро сходится к нечеткой основе правила во время обучения. На втором шаге с помощью основы правила от первого шага, когда начальное условие обеспечивает быструю сходимость настраивающего процесса параметра.
Изучите правила
Чтобы изучить основу правила, сначала задайте настраивающиеся опции с помощью tunefisOptions
объект. Поскольку FIS позволяет большое количество выхода MFs (используемый в следствиях правила), используйте глобальный метод оптимизации (генетический алгоритм или рой частицы). Такие методы выполняют лучше в больших диапазонах настройки параметра по сравнению с локальными методами оптимизации (поиск шаблона и отжиг симуляции). В данном примере настройте 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 = 0x0 empty string array
Изученная система должна иметь подобную производительность 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;
Настройте параметры 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 = 3.272 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, количество входных параметров, количество MFS ввода/вывода, типов MF и количества правил. Для нечетких систем с большим количеством входных параметров Sugeno FIS обычно сходится быстрее, чем Mamdani FIS, поскольку система Sugeno имеет меньше параметров выхода MF (если constant
MFS используется), и быстрее defuzzification. Небольшие числа MFS и правил сокращают количество параметров, чтобы настроиться, производя более быстрый настраивающий процесс. Кроме того, большое количество правил может сверхсоответствовать обучающим данным. В общем случае для больших нечетких систем, дерево FIS может произвести подобную производительность с меньшим числом правил по сравнению с одним FIS. Для примера смотрите Мелодию Дерево FIS для Прогноза Расхода бензина.
Изменение настроек настраиваемого параметра для MFS и правил. Например, можно настроить поддержку треугольного 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
getTunableSettings
| mamfis
| tunefis