Настройте нечеткую систему вывода Mamdani

В этом примере показано, как настроить функцию принадлежности (MF) и параметры правила нечеткой системы вывода (FIS) Mamdani. Этот пример использует рой частицы и оптимизацию поиска шаблона, которые требуют программного обеспечения Global Optimization Toolbox™.

Автомобильный прогноз расхода топлива в милях на галлон (MPG) является типичной нелинейной проблемой регрессии. Это использует несколько автомобильных атрибутов профиля, чтобы предсказать расход топлива. Обучающие данные доступны в Калифорнийском университете в Репозитории Машинного обучения Ирвина и содержат данные, собранные от автомобилей различных, делает и модели.

Этот пример использует следующие шесть атрибутов входных данных, чтобы предсказать, что выходные данные приписывают MPG с FIS:

  1. Количество цилиндров

  2. Смещение

  3. Лошадиная сила

  4. Вес

  5. Ускорение

  6. Модельный год

Подготовка данных

Загрузите данные. Каждая строка набора данных, полученного из репозитория, представляет различный автомобильный профиль.

[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)'];

Создайте FIS использование Областей значений Атрибута Данных

Создайте Mamdani FIS для настройки.

fisin = mamfis;

Добавьте переменные ввода и вывода в FIS, где каждая переменная представляет один из атрибутов данных. Для каждой переменной используйте соответствующее название атрибута и область значений.

Чтобы сократить количество правил, используйте два MFS в каждой входной переменной, которая приводит к 26=64 комбинации входа 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)

Настройте FIS с обучающими данными

Настройка выполняется на двух шагах.

  1. Изучите основу правила при хранении параметров MF ввода и вывода постоянными.

  2. Настройте параметры 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

Смотрите также

| |

Похожие темы