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

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

Предсказание потребления автомобильного топлива в милях на галлон (MPG) является типичной нелинейной задачей регрессии. Он использует несколько атрибутов профиля автомобиля, чтобы предсказать расход топлива. Обучающие данные доступны в Калифорнийском университете в Irvine Machine Learning Repository и содержат данные, собранные с автомобилей различных марок и моделей.

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

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

  2. Смещение

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

  4. Вес

  5. Ускорение

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

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

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

[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 FIS для настройки.

fisin = mamfis;

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

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

Figure contains 8 axes. Axes 1 contains 2 objects of type line. Axes 2 contains 2 objects of type line. Axes 3 contains 2 objects of type line. Axes 4 contains 2 objects of type line. Axes 5 contains 2 objects of type line. Axes 6 contains 2 objects of type line. Axes 7 contains 64 objects of type line. Axes 8 contains 3 objects of type text.

Настройка FIS с помощью обучающих данных

Настройка выполняется в два этапа.

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

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

The Best f(x) столбец показывает обучающую корневую - среднюю - квадратную - ошибку (RMSE).

Просмотрите структуру настроенной FIS, fisout1.

plotfis(fisout1)

Figure contains 8 axes. Axes 1 contains 2 objects of type line. Axes 2 contains 2 objects of type line. Axes 3 contains 2 objects of type line. Axes 4 contains 2 objects of type line. Axes 5 contains 2 objects of type line. Axes 6 contains 2 objects of type line. Axes 7 contains 64 objects of type line. Axes 8 contains 3 objects of type text.

Процесс обучения создает набор новых правил для 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)

Figure contains 2 axes. Axes 1 with title RMSE = 4.315 MPG contains 3 objects of type bar. These objects represent Actual MPG, Expected MPG, Minimum of actual and expected values. Axes 2 with title Difference Between Actual and Expected Values contains an object of type bar.

Поскольку ошибки обучения и валидации аналогичны, обученная система не перегружает обучающие данные.

Настройка всех параметров

После изучения новых правил настройте параметры входного/выходного 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)

Figure contains 8 axes. Axes 1 contains 2 objects of type line. Axes 2 contains 2 objects of type line. Axes 3 contains 2 objects of type line. Axes 4 contains 2 objects of type line. Axes 5 contains 2 objects of type line. Axes 6 contains 2 objects of type line. Axes 7 contains 64 objects of type line. Axes 8 contains 3 objects of type text.

Проверяйте эффективность

Проверьте эффективность настроенной FIS, fisout, используя набор входных данных валидации vldX.

Сравните ожидаемый MPG, полученный из выхода данных валидации vldY и фактический MPG, сгенерированный с использованием fisout. Вычислите RMSE между этими результатами.

plotActualAndExpectedResultsWithRMSE(fisout,vldX,vldY);

Figure contains 2 axes. Axes 1 with title RMSE = 3.0116 MPG contains 3 objects of type bar. These objects represent Actual MPG, Expected MPG, Minimum of actual and expected values. Axes 2 with title Difference Between Actual and Expected Values contains an object of type bar.

Настройка параметров 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, количество входов, количество входов/выходов MF, типы MF и количество правил. Для нечетких систем с большим количеством входов Sugeno FIS обычно сходится быстрее, чем Mamdani FIS, поскольку система Sugeno имеет меньше выходных параметров MF (если constant Используются MF) и более быстрая дефаззификация. Небольшое количество MF и правил сокращают количество параметров для настройки, создавая более быстрый процесс настройки. Кроме того, большое количество правил может перегружать обучающие данные. В целом, для больших нечетких систем дерево FIS может создавать сходную эффективность с меньшим количеством правил по сравнению с одной FIS. Для получения примера смотрите Tune FIS Tree for Gas Mileage Предсказания.

  • Изменение настроек настраиваемых параметров для 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

См. также

| |

Похожие темы