В этом примере показано, как настроить функцию принадлежности (MF) и параметры правила нечеткой системы вывода (FIS) Mamdani. Этот пример использует рой частицы и оптимизацию поиска шаблона, которые требуют программного обеспечения 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)'];
Создайте 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 = 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
к истине.
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
(Global Optimization Toolbox), particleswarm
(Global Optimization Toolbox), patternsearch
(Global Optimization Toolbox) и simulannealbnd
(Global Optimization Toolbox).
Изменяя свойства FIS, такие как тип FIS, количество входных параметров, количество MFS ввода/вывода, типов MF и количества правил. Для нечетких систем с большим количеством входных параметров Sugeno FIS обычно сходится быстрее, чем Mamdani FIS, поскольку система Sugeno имеет меньше параметров выхода MF (если constant
MFS используется), и более быстрая дефаззификация. Небольшие числа 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
genfis
| getTunableSettings
| tunefis