Этот пример показывает, как настроить функцию принадлежности (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 = true;
Установки параметров могут быть пустыми при изучении новых правил. Для получения дополнительной информации смотрите tunefis
.
if runtunefis fisout1 = tunefis(fisin,[],trnX,trnY,options); else tunedfis = load('tunedfismpgprediction.mat'); %#ok<UNRCH> fisout1 = tunedfis.fisout1; fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisout1,trnX,trnY)); end
Best Mean Stall Iteration f-count f(x) f(x) Iterations 0 100 7.008 9.256 0 1 200 6.515 9.432 0 2 300 6.515 9.214 1 3 400 6.496 9.02 0 4 500 6.495 9.008 0 5 600 6.084 8.783 0 6 700 5.889 8.795 0 7 800 5.889 8.794 1 8 900 5.134 8.463 0 9 1000 5.134 8.676 1 10 1100 5.134 8.609 2 11 1200 5.134 8.244 3 12 1300 5.134 8.365 4 13 1400 5.134 8.054 5 14 1500 5.134 8.112 6 15 1600 5.134 7.703 7 16 1700 4.932 7.326 0 17 1800 4.554 7.113 0 18 1900 4.554 6.702 1 19 2000 4.452 6.377 0 20 2100 4.452 6.235 1 Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.
Столбец Best f(x)
показывает учебную среднеквадратическую ошибку (RMSE).
Просмотрите структуру настроенного FIS, fisout1
.
plotfis(fisout1)
Процесс обучения производит набор новых правил для FIS. Например, просмотрите описания первых трех правил.
[fisout1.Rules(1:3).Description]'
ans = 3×1 string array
"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;
Настройте параметры FIS с помощью заданных настраиваемых настроек, данных тренировки, и настроив опции.
Настройка значений параметров с функцией tunefis
занимает приблизительно 5 минут. Чтобы загрузить предварительно обученные результаты, не запуская tunefis
, можно установить runtunefis
на false
.
if runtunefis rng('default') fisout = tunefis(fisout1,[in;out;rule],trnX,trnY,options); else fisout = tunedfis.fisout; %#ok<UNRCH> fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisout,trnX,trnY)); end
Iter Func-count f(x) MeshSize Method 0 1 4.25857 1 1 2 4.23578 2 Successful Poll 2 4 4.23562 4 Successful Poll 3 5 4.23525 8 Successful Poll 4 6 4.23473 16 Successful Poll 5 7 4.23324 32 Successful Poll 6 8 4.23129 64 Successful Poll 7 10 4.17603 128 Successful Poll 8 14 4.16089 256 Successful Poll 9 19 4.02839 512 Successful Poll 10 22 3.8461 1024 Successful Poll 11 28 3.7905 2048 Successful Poll 12 34 3.7905 1024 Refine Mesh 13 39 3.73343 2048 Successful Poll 14 45 3.73343 1024 Refine Mesh 15 53 3.73343 512 Refine Mesh 16 57 3.72264 1024 Successful Poll 17 65 3.72264 512 Refine Mesh 18 73 3.71039 1024 Successful Poll 19 81 3.71039 512 Refine Mesh 20 91 3.70128 1024 Successful Poll 21 99 3.70128 512 Refine Mesh 22 110 3.70128 256 Refine Mesh 23 114 3.69992 512 Successful Poll 24 120 3.68807 1024 Successful Poll 25 128 3.68807 512 Refine Mesh 26 135 3.6867 1024 Successful Poll 27 142 3.6867 512 Refine Mesh 28 152 3.67888 1024 Successful Poll 29 159 3.67888 512 Refine Mesh 30 170 3.67888 256 Refine Mesh Iter Func-count f(x) MeshSize Method 31 176 3.67859 512 Successful Poll 32 186 3.67859 256 Refine Mesh 33 194 3.6466 512 Successful Poll 34 203 3.6466 256 Refine Mesh 35 206 3.64121 512 Successful Poll 36 215 3.64121 256 Refine Mesh 37 228 3.6412 512 Successful Poll 38 237 3.6412 256 Refine Mesh 39 254 3.6412 128 Refine Mesh 40 273 3.47202 256 Successful Poll 41 280 3.47067 512 Successful Poll 42 289 3.47067 256 Refine Mesh 43 303 3.38247 512 Successful Poll 44 308 3.34678 1024 Successful Poll 45 315 3.34678 512 Refine Mesh 46 324 3.34678 256 Refine Mesh 47 330 3.34482 512 Successful Poll 48 339 3.34482 256 Refine Mesh 49 347 3.32178 512 Successful Poll 50 348 3.32027 1024 Successful Poll 51 355 3.32027 512 Refine Mesh 52 364 3.32027 256 Refine Mesh 53 371 3.30488 512 Successful Poll 54 380 3.30488 256 Refine Mesh 55 395 3.30488 128 Refine Mesh 56 402 3.28894 256 Successful Poll 57 405 3.27455 512 Successful Poll 58 414 3.27455 256 Refine Mesh 59 429 3.27209 512 Successful Poll 60 438 3.27209 256 Refine Mesh 61 454 3.27209 128 Refine Mesh Maximum number of iterations exceeded: increase options.MaxIterations.
В конце настраивающего процесса некоторые настроенные формы 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 (если MFS constant
используется), и быстрее 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