Настройте нечеткую систему вывода 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 = 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, который сокращает общее количество правил во время фазы изучения.

Localfunctions

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

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

| |

Похожие темы