Настройте дерево FIS для прогноза расхода бензина

Этот пример показывает, как к настройкам параметров дерева FIS, которое является набором связанных нечетких систем вывода. Этот пример использует рой частицы и оптимизацию поиска шаблона, которые требуют программного обеспечения Global Optimization Toolbox™.

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

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

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

  2. Смещение

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

  4. Вес

  5. Ускорение

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

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

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

data = loadgas;

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

В данном примере создайте дерево FIS с помощью следующих шагов:

  1. Оцените входные атрибуты на основе их корреляций с выходным атрибутом.

  2. Создайте несколько объектов FIS с помощью оцениваемых входных атрибутов.

  3. Создайте дерево FIS из объектов FIS.

Оцените входные параметры согласно коэффициентам корреляции

Вычислите коэффициенты корреляции для данных тренировки. В итоговой строке корреляционной матрицы первые шесть элементов показывают коэффициенты корреляции между шестью помещенными атрибутами данных и выходным атрибутом.

c1 = corrcoef(data);
c1(end,:)
ans = 1×7

   -0.7776   -0.8051   -0.7784   -0.8322    0.4233    0.5805    1.0000

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

Оцените входные атрибуты, которые имеют отрицательные корреляции в порядке убывания абсолютным значением их коэффициентов корреляции.

  1. Вес

  2. Смещение

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

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

Оцените входные атрибуты, которые имеют положительные корреляции в порядке убывания абсолютным значением их коэффициентов корреляции.

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

  2. Ускорение

Эти рейтинги показывают, что вес и модельный год имеет самые высокие отрицательные и положительные корреляции с MPG, соответственно.

Создайте нечеткие системы вывода

В данном примере реализуйте дерево FIS со следующей структурой.

Дерево FIS использует, приблизительно два вводят объект вывода FIS сократить общее количество правил, использованных В процессе вывода. fis1, fis2 и fis3 непосредственно берут входные значения и генерируют промежуточные значения MPG, которые далее объединены с помощью fis4 и fis5.

Входные атрибуты со значениями отрицательной и положительной корреляции разделены на пары, чтобы объединить и положительные и отрицательные эффекты на вывод для прогноза. Входные параметры сгруппированы согласно их рангам можно следующим образом:

  • Вес и модельный год

  • Смещение и ускорение

  • Лошадиная сила и количество цилиндров

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

Этот пример использует Sugeno-тип объекты FIS для более быстрой оценки во время настраивающего процесса по сравнению с системами Mamdani. Каждый FIS включает два входных параметров и один вывод, где каждый вход содержит две треугольных функции принадлежности по умолчанию (MFS), и вывод включает 4 постоянных MFS по умолчанию. Задайте области значений ввода и вывода с помощью соответствующих областей значений атрибута данных.

Первый FIS комбинирует атрибуты модельного года и вес.

fis1 = sugfis('Name','fis1');
fis1 = addInput(fis1,dataRange(4,:),'NumMFs',2,'Name',"weight");
fis1 = addInput(fis1,dataRange(6,:),'NumMFs',2,'Name',"year");
fis1 = addOutput(fis1,dataRange(7,:),'NumMFs',4);

Второй FIS комбинирует ускоряющие атрибуты и смещение.

fis2 = sugfis('Name','fis2');
fis2 = addInput(fis2,dataRange(2,:),'NumMFs',2,'Name',"displacement");
fis2 = addInput(fis2,dataRange(5,:),'NumMFs',2,'Name',"acceleration");
fis2 = addOutput(fis2,dataRange(7,:),'NumMFs',4);

Третий FIS комбинирует лошадиную силу и количество цилиндрических атрибутов.

fis3 = sugfis('Name','fis3');
fis3 = addInput(fis3,dataRange(3,:),'NumMFs',2,'Name',"horsepower");
fis3 = addInput(fis3,dataRange(1,:),'NumMFs',2,'Name',"cylinders");
fis3 = addOutput(fis3,dataRange(7,:),'NumMFs',4);

Четвертый FIS комбинирует выходные параметры первого и второго FIS.

fis4 = sugfis('Name','fis4');
fis4 = addInput(fis4,dataRange(7,:),'NumMFs',2);
fis4 = addInput(fis4,dataRange(7,:),'NumMFs',2);
fis4 = addOutput(fis4,dataRange(7,:),'NumMFs',4);

Итоговый FIS комбинирует выходные параметры третьего и четвертого FIS и генерирует предполагаемый MPG. Этот FIS имеет те же области значений ввода и вывода как четвертый FIS.

fis5 = fis4;
fis5.Name = 'fis5';
fis5.Outputs(1).Name = "mpg";

Создайте дерево FIS

Соедините нечеткие системы (fis1, fis2, fis3, fis4 и fis5) согласно древовидной схеме FIS.

fisTin = fistree([fis1 fis2 fis3 fis4 fis5],[ ...
    "fis1/output1" "fis4/input1"; ...
    "fis2/output1" "fis4/input2"; ...
    "fis3/output1" "fis5/input2"; ...
    "fis4/output1" "fis5/input1"])
fisTin = 
  fistree with properties:

                        FIS: [1×5 sugfis]
                Connections: [4×2 string]
                     Inputs: [6×1 string]
                    Outputs: "fis5/mpg"
    DisableStructuralChecks: 0

	See 'getTunableSettings' method for parameter optimization.

Настройте дерево FIS с данными тренировки

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

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

  2. Настройте параметры MFS ввода/вывода и правил.

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

Изучите правила

Чтобы изучить основу правила, сначала задайте настраивающиеся опции с помощью объекта tunefisOptions. Глобальные методы оптимизации (генетический алгоритм или рой частицы) подходят для начальной подготовки, когда все параметры нечеткой системы не настраиваются. В данном примере настройте дерево FIS с помощью метода оптимизации роя частицы ('particleswarm').

Чтобы изучить новые правила, установите OptimizationType на 'learning'. Ограничьте максимальное количество правил к 4. Количество настроенных правил каждого FIS может быть меньше, чем этот предел, поскольку настраивающий процесс удаляет дублирующиеся правила.

options = tunefisOptions('Method','particleswarm',...
    'OptimizationType','learning', ...
    'NumMaxRules',4);

Если у вас есть программное обеспечение Parallel Computing Toolbox™, можно улучшить скорость настраивающего процесса установкой options.UseParallel к true. Если у вас нет программного обеспечения Parallel Computing Toolbox, установите options.UseParallel на false.

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

options.MethodOptions.MaxIterations = 50;

Поскольку оптимизация роя частицы использует случайный поиск, чтобы получить восстанавливаемые результаты, инициализировать генератор случайных чисел к его настройке по умолчанию.

rng('default')

Настройте дерево FIS с помощью заданных настраивающих данных и опций. Установите входной порядок данных тренировки согласно древовидным связям FIS можно следующим образом: weight, year, displacement, acceleration, horsepower и cylinders.

inputOrders1 = [4 6 2 5 3 1];
orderedTrnX1 = trnX(:,inputOrders1);

Изучение правил с функцией tunefis занимает приблизительно 4 минуты. В данном примере позвольте настроиться установкой runtunefis на true. Чтобы загрузить предварительно обученные результаты, не запуская tunefis, можно установить runtunefis на false.

runtunefis = true;

Установки параметров могут быть пустыми при изучении новых правил. Для получения дополнительной информации смотрите tunefis.

if runtunefis
    fisTout1 = tunefis(fisTin,[],orderedTrnX1,trnY,options);
else
    tunedfis = load('tunedfistreempgprediction.mat'); %#ok<UNRCH>
    fisTout1 = tunedfis.fisTout1;
    fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout1,orderedTrnX1,trnY));
end
                                 Best            Mean     Stall
Iteration     f-count            f(x)            f(x)    Iterations
    0             100           5.697           12.63        0
    1             200           5.697           14.45        0
    2             300           5.222           12.26        0
    3             400           5.222           13.44        1
    4             500           5.222            12.9        2
    5             600           4.944           12.19        0
    6             700           4.944            12.2        1
    7             800           4.563           13.31        0
    8             900           4.563           12.92        1
    9            1000           4.563           12.06        2
   10            1100           4.563           13.32        3
   11            1200           4.563           11.82        4
   12            1300           4.563           13.04        5
   13            1400           4.563            12.2        6
   14            1500           4.563           11.94        7
   15            1600           4.563           11.33        8
   16            1700           4.563           10.71        9
   17            1800           4.538           11.39        0
   18            1900           4.538           11.27        1
   19            2000           4.538           11.32        2
   20            2100           4.538           11.26        3
   21            2200           4.538           11.07        4
   22            2300           4.538           10.53        5
   23            2400           4.538           10.15        6
   24            2500           4.538           10.66        7
   25            2600           4.452           10.28        0
   26            2700           4.408           10.42        0
   27            2800           4.243           9.661        0
   28            2900           4.061           9.153        0
   29            3000           4.061           9.849        1
   30            3100           4.024           9.029        0

                                 Best            Mean     Stall
Iteration     f-count            f(x)            f(x)    Iterations
   31            3200           4.024            9.91        1
   32            3300           4.024           8.847        2
   33            3400           3.996           8.684        0
   34            3500           3.991           8.674        0
   35            3600           3.569           9.125        0
   36            3700           3.569           8.942        1
   37            3800           3.512            8.21        0
   38            3900           3.512           8.262        1
   39            4000           3.512           8.452        2
   40            4100           3.485           8.343        0
   41            4200           3.485           8.451        1
   42            4300           3.437            8.52        0
   43            4400           3.425           8.136        0
   44            4500           3.425           8.254        1
   45            4600           3.423           8.065        0
   46            4700           3.423             7.6        1
   47            4800           3.417           7.586        0
   48            4900           3.399           7.546        0
   49            5000           3.399           7.335        1
   50            5100           3.399           7.816        2
Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.

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

Процесс обучения производит набор новых правил для дерева FIS.

fprintf("Total number of rules = %d\n",numel([fisTout1.FIS.Rules]));
Total number of rules = 17

Изученная система должна иметь подобную производительность RMSE и для наборов данных обучения и для валидации. Чтобы вычислить RMSE для набора данных валидации, оцените fisout1 с помощью набора входных данных валидации vldX. Чтобы скрыть предупреждения во время выполнения во время оценки, установите все опции предупреждения на none.

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

orderedVldX1 = vldX(:,inputOrders1);
plotActualAndExpectedResultsWithRMSE(fisTout1,orderedVldX1,vldY)

Настройте все параметры

После изучения новых правил настройте параметры MF ввода/вывода наряду с параметрами изученных правил. Чтобы получить настраиваемые параметры дерева FIS, используйте функцию getTunableSettings.

[in,out,rule] = getTunableSettings(fisTout1);

Чтобы настроить существующие древовидные установки параметров FIS, не изучая новых правил, установите OptimizationType на 'tuning'.

options.OptimizationType = 'tuning';

Поскольку дерево FIS уже узнало, что правила с помощью данных тренировки, используют локальный метод оптимизации для быстрой сходимости значений параметров. В данном примере используйте метод оптимизации поиска шаблона ('patternsearch').

options.Method = 'patternsearch';

Настройка древовидных параметров FIS берет больше итераций, чем предыдущий изучающий правило шаг. Поэтому увеличьте максимальное число итераций настраивающего процесса к 75. Как на первом настраивающем этапе, можно уменьшать учебные ошибки путем увеличения числа итераций. Однако использование слишком многих итераций может сверхнастроить параметры на данные тренировки, увеличив ошибки валидации.

options.MethodOptions.MaxIterations = 75;

Настройте древовидные параметры FIS с помощью заданных настраиваемых настроек, данных тренировки, и настроив опции.

Настройка значений параметров с функцией tunefis занимает несколько минут. Чтобы загрузить предварительно обученные результаты, не запуская tunefis, можно установить runtunefis на false.

rng('default')
if runtunefis
    fisTout2 = tunefis(fisTout1,[in;out;rule],orderedTrnX1,trnY,options);
else
    fisTout2 = tunedfis.fisTout2; %#ok<UNRCH>
    fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout2,orderedTrnX1,trnY));
end
Iter     Func-count       f(x)      MeshSize     Method
    0           1        3.56396             1      
    1           2        3.56389             2     Successful Poll
    2           3        3.56374             4     Successful Poll
    3           4        3.56344             8     Successful Poll
    4           5        3.56285            16     Successful Poll
    5           6        3.56172            32     Successful Poll
    6           7         3.5596            64     Successful Poll
    7           8          3.556           128     Successful Poll
    8           9        3.55073           256     Successful Poll
    9          10         3.5431           512     Successful Poll
   10          17         3.5431           256     Refine Mesh
   11          27           3.54           512     Successful Poll
   12          34           3.54           256     Refine Mesh
   13          48           3.54           128     Refine Mesh
   14          50        3.53968           256     Successful Poll
   15          55        3.53961           512     Successful Poll
   16          62        3.53961           256     Refine Mesh
   17          76        3.53961           128     Refine Mesh
   18          84        3.35952           256     Successful Poll
   19          86        3.35153           512     Successful Poll
   20          93        3.35078          1024     Successful Poll
   21          99        3.35078           512     Refine Mesh
   22         107        3.35078           256     Refine Mesh
   23         120        3.35078           128     Refine Mesh
   24         141        3.34063           256     Successful Poll
   25         150        3.33599           512     Successful Poll
   26         158        3.33599           256     Refine Mesh
   27         172        3.33599           128     Refine Mesh
   28         181        3.33546           256     Successful Poll
   29         194        3.33546           128     Refine Mesh
   30         217         3.3198           256     Successful Poll

Iter     Func-count        f(x)       MeshSize      Method
   31         230         3.3198           128     Refine Mesh
   32         240        3.31883           256     Successful Poll
   33         253        3.31883           128     Refine Mesh
   34         275        3.31883            64     Refine Mesh
   35         276          3.316           128     Successful Poll
   36         298          3.316            64     Refine Mesh
   37         321          3.316            32     Refine Mesh
   38         329        3.31085            64     Successful Poll
   39         347        3.30905           128     Successful Poll
   40         348        3.30398           256     Successful Poll
   41         361        3.30398           128     Refine Mesh
   42         383        3.30398            64     Refine Mesh
   43         408        3.30398            32     Refine Mesh
   44         460        3.30398            16     Refine Mesh
   45         467        3.30375            32     Successful Poll
   46         519        3.30375            16     Refine Mesh
   47         532        3.30329            32     Successful Poll
   48         584        3.30329            16     Refine Mesh
   49         598        3.28079            32     Successful Poll
   50         608        3.28036            64     Successful Poll
   51         630        3.27888           128     Successful Poll
   52         639        3.27672           256     Successful Poll
   53         652        3.27672           128     Refine Mesh
   54         672        3.27672            64     Refine Mesh
   55         697        3.27672            32     Refine Mesh
   56         750        3.27672            16     Refine Mesh
   57         779        3.27535            32     Successful Poll
   58         832        3.27535            16     Refine Mesh
   59         863        3.27182            32     Successful Poll
   60         910        3.26985            64     Successful Poll

Iter     Func-count        f(x)       MeshSize      Method
   61         935        3.26985            32     Refine Mesh
   62         988        3.26985            16     Refine Mesh
   63        1064        3.26985             8     Refine Mesh
   64        1066        3.26957            16     Successful Poll
   65        1142        3.26957             8     Refine Mesh
   66        1155        3.26792            16     Successful Poll
   67        1231        3.26792             8     Refine Mesh
   68        1247        3.26139            16     Successful Poll
   69        1323        3.26139             8     Refine Mesh
   70        1421        3.26139             4     Refine Mesh
   71        1422        3.26118             8     Successful Poll
   72        1520        3.26118             4     Refine Mesh
   73        1522        3.26095             8     Successful Poll
   74        1620        3.26095             4     Refine Mesh
   75        1633        3.26094             8     Successful Poll
   76        1731        3.26094             4     Refine Mesh
Maximum number of iterations exceeded: increase options.MaxIterations.

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

Проверяйте производительность

Подтвердите производительность настроенного дерева FIS, fisout2, с помощью входных данных валидации установил vldX.

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

plotActualAndExpectedResultsWithRMSE(fisTout2,orderedVldX1,vldY)

Настройка древовидных параметров FIS улучшается, RMSE по сравнению с результатами начальной буквы изучил основу правила. Поскольку ошибки обучения и валидации подобны, значения параметров не сверхнастраиваются.

Анализируйте промежуточные данные

Чтобы получить сведения об операции вашего нечеткого дерева, можно добавить выходные параметры нечетких систем компонента как выходные параметры дерева FIS. В данном примере, чтобы получить доступ к промежуточному FIS выходные параметры, добавьте три дополнительных выходных параметров в настроенное дерево FIS.

fisTout3 = fisTout2;
fisTout3.Outputs(end+1) = "fis1/output1";
fisTout3.Outputs(end+1) = "fis2/output1";
fisTout3.Outputs(end+1) = "fis3/output1";

Чтобы сгенерировать дополнительные выходные параметры, оцените увеличенное дерево FIS, fisTout3.

actY = evaluateFIS(fisTout3,orderedVldX1);
figure,plot(actY(:,[2 3 4 1])),xlabel("Input dataset index"),ylabel("MPG"),axis([1 200 0 55])
legend(["Output of fis1" "Output of fis2" "Output of fis3" "Output of fis5"],...
    'Location','NorthEast','NumColumns',2)
title("Intermediate and Final Outputs")

Окончательный результат дерева FIS (fis5 вывод), кажется, высоко коррелируется с выходными параметрами fis1 и fis3. Чтобы подтвердить эту оценку, проверяйте коэффициенты корреляции FIS выходные параметры.

c2 = corrcoef(actY(:,[2 3 4 1]));
c2(end,:)
ans = 1×4

    0.9724    0.7935   -0.8156    1.0000

Последняя строка корреляционной матрицы показывает, что выходные параметры fis1 и fis3 (сначала и третий столбец, соответственно) имеют более высокие корреляции с окончательным результатом по сравнению с выводом fis2 (второй столбец). Этот результат показывает, что упрощение дерева FIS путем удаления fis2 и fis4 и может потенциально привести к подобным учебным результатам по сравнению с исходной древовидной структурой.

Упростите и переобучите дерево FIS

Удалите fis2 и fis4 от дерева FIS и соедините вывод fis1 к первому входу fis5. Когда вы удаляете FIS из дерева FIS, любых существующих связей с этим, FIS также удалены.

fisTout3.FIS([2 4]) = [];
fisTout3.Connections(end+1,:) = ["fis1/output1" "fis5/input1"];
fis5.Inputs(1).Name = "fis1out";

Заставить количество древовидных выходных параметров FIS совпадать с количеством выходных параметров в данных тренировки, удалить древовидные выходные параметры FIS из fis1 и fis3.

fisTout3.Outputs(2:end) = [];

Обновите входной порядок данных тренировки согласно новой древовидной входной настройке FIS.

inputOrders2 = [4 6 3 1];
orderedTrnX2 = trnX(:,inputOrders2);

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

options.Method = "particleswarm";
options.OptimizationType = "learning";
options.MethodOptions.MaxIterations = 50;

[~,~,rule] = getTunableSettings(fisTout3);

rng('default')
if runtunefis
    fisTout4 = tunefis(fisTout3,rule,orderedTrnX2,trnY,options);
else
    fisTout4 = tunedfis.fisTout4; %#ok<UNRCH>
    fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout4,orderedTrnX2,trnY));
end
                                 Best            Mean     Stall
Iteration     f-count            f(x)            f(x)    Iterations
    0             100           5.592           11.74        0
    1             200           5.592           13.89        0
    2             300           5.278           12.52        0
    3             400            4.84           11.89        0
    4             500            4.84           12.98        1
    5             600           3.803           11.59        0
    6             700           3.803           12.25        1
    7             800           3.803           11.88        2
    8             900           3.803           12.28        3
    9            1000            3.17           11.53        0
   10            1100            3.17           12.09        1
   11            1200            3.17           11.92        2
   12            1300            3.17           11.38        3
   13            1400            3.17           11.89        4
   14            1500            3.17           10.51        5
   15            1600            3.17           9.628        6
   16            1700            3.17           9.383        7
   17            1800            3.17           8.849        8
   18            1900            3.17            8.35        9
   19            2000            3.17           8.374       10
   20            2100           3.163           7.869        0
   21            2200           3.163           7.388        1
   22            2300           3.163            7.35        2
   23            2400           3.163           7.067        3
   24            2500           3.163           7.111        4
   25            2600           3.163           6.967        5
   26            2700           3.085           6.565        0
   27            2800           3.004           6.608        0
   28            2900           3.004           6.321        1
   29            3000           2.983           6.008        0
   30            3100           2.983           5.986        1

                                 Best            Mean     Stall
Iteration     f-count            f(x)            f(x)    Iterations
   31            3200           2.983           6.467        2
   32            3300           2.983           5.947        3
   33            3400           2.977           5.921        0
   34            3500           2.977            5.44        1
   35            3600           2.977           5.796        2
   36            3700           2.977           5.591        3
   37            3800           2.977           5.492        4
   38            3900           2.977           5.521        5
   39            4000           2.977           5.628        6
   40            4100           2.977           5.931        7
   41            4200           2.943           5.258        0
   42            4300           2.943           5.904        1
   43            4400           2.943           6.198        2
   44            4500           2.929           5.612        0
   45            4600           2.929           5.587        1
   46            4700           2.929           5.715        2
   47            4800           2.929           5.525        3
   48            4900           2.929           5.506        4
   49            5000           2.929           5.336        5
   50            5100           2.929           5.493        6
Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.

В учебной фазе настраиваются параметры функции принадлежности и правил.

options.Method = "patternsearch";
options.OptimizationType = "tuning";
options.MethodOptions.MaxIterations = 75;
[in,out,rule] = getTunableSettings(fisTout4);
rng('default')
if runtunefis
    fisTout5 = tunefis(fisTout4,[in;out;rule],orderedTrnX2,trnY,options);
else
    fisTout5 = tunedfis.fisTout5; %#ok<UNRCH>
    fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout5,orderedTrnX2,trnY));
end
Iter     Func-count       f(x)      MeshSize     Method
    0           1        2.92888             1      
    1           2        2.92888             2     Successful Poll
    2           3        2.92887             4     Successful Poll
    3           4        2.92884             8     Successful Poll
    4           5        2.92881            16     Successful Poll
    5           6        2.92879            32     Successful Poll
    6          14         2.9117            64     Successful Poll
    7          15        2.91093           128     Successful Poll
    8          22        2.90552           256     Successful Poll
    9          23        2.88691           512     Successful Poll
   10          29        2.88691           256     Refine Mesh
   11          37        2.88691           128     Refine Mesh
   12          38        2.88549           256     Successful Poll
   13          46        2.88549           128     Refine Mesh
   14          59        2.88549            64     Refine Mesh
   15          65        2.88521           128     Successful Poll
   16          78        2.88521            64     Refine Mesh
   17          80         2.8825           128     Successful Poll
   18          85        2.87991           256     Successful Poll
   19          93        2.87991           128     Refine Mesh
   20         106        2.87991            64     Refine Mesh
   21         119        2.87526           128     Successful Poll
   22         131        2.87526            64     Refine Mesh
   23         147        2.87526            32     Refine Mesh
   24         154        2.87514            64     Successful Poll
   25         170        2.87514            32     Refine Mesh
   26         180        2.86842            64     Successful Poll
   27         187        2.86722           128     Successful Poll
   28         200        2.86722            64     Refine Mesh
   29         207        2.86719           128     Successful Poll
   30         220        2.86719            64     Refine Mesh

Iter     Func-count        f(x)       MeshSize      Method
   31         235        2.86719            32     Refine Mesh
   32         236        2.86708            64     Successful Poll
   33         251        2.86708            32     Refine Mesh
   34         260        2.86638            64     Successful Poll
   35         261        2.86515           128     Successful Poll
   36         274        2.86515            64     Refine Mesh
   37         289        2.86515            32     Refine Mesh
   38         290        2.86501            64     Successful Poll
   39         305        2.86501            32     Refine Mesh
   40         336        2.86501            16     Refine Mesh
   41         339        2.85839            32     Successful Poll
   42         370        2.85839            16     Refine Mesh
   43         374        2.85824            32     Successful Poll
   44         405        2.85824            16     Refine Mesh
   45         417        2.85823            32     Successful Poll
   46         448        2.85823            16     Refine Mesh
   47         490        2.85823             8     Refine Mesh
   48         491        2.85822            16     Successful Poll
   49         533        2.85822             8     Refine Mesh
   50         535        2.85806            16     Successful Poll
   51         547        2.85797            32     Successful Poll
   52         578        2.85797            16     Refine Mesh
   53         590        2.85796            32     Successful Poll
   54         621        2.85796            16     Refine Mesh
   55         663        2.85796             8     Refine Mesh
   56         664        2.85795            16     Successful Poll
   57         706        2.85795             8     Refine Mesh
   58         711         2.8579            16     Successful Poll
   59         753         2.8579             8     Refine Mesh
   60         759        2.85743            16     Successful Poll

Iter     Func-count        f(x)       MeshSize      Method
   61         771        2.85698            32     Successful Poll
   62         778        2.85633            64     Successful Poll
   63         785        2.85584           128     Successful Poll
   64         797        2.85584            64     Refine Mesh
   65         813        2.85584            32     Refine Mesh
   66         844        2.85584            16     Refine Mesh
   67         886        2.85584             8     Refine Mesh
   68         904        2.85548            16     Successful Poll
   69         905        2.85539            32     Successful Poll
   70         936        2.85539            16     Refine Mesh
   71         937        2.85538            32     Successful Poll
   72         968        2.85538            16     Refine Mesh
   73        1010        2.85538             8     Refine Mesh
   74        1026        2.85537            16     Successful Poll
   75        1068        2.85537             8     Refine Mesh
   76        1090        2.82832            16     Successful Poll
Maximum number of iterations exceeded: increase options.MaxIterations.

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

fprintf("Total number of rules = %d\n",numel([fisTout5.FIS.Rules]));
Total number of rules = 11

Проверяйте производительность упрощенного дерева FIS

Оцените обновленное дерево FIS с помощью четырех входных атрибутов набора данных проверки.

orderedVldX2 = vldX(:,inputOrders2);
plotActualAndExpectedResultsWithRMSE(fisTout5,orderedVldX2,vldY)

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

Заключение

Можно далее улучшить учебную ошибку настроенного дерева FIS:

  • Растущее число итераций и в изучающих правило и в настраивающих параметр фазах. Выполнение так увеличивает длительность процесса оптимизации и может также увеличить ошибку валидации из-за сверхнастроенных системных параметров с данными тренировки.

  • Используя глобальные методы оптимизации, такие как ga и particleswarm, и в изучающих правило и в настраивающих параметр фазах. ga и particleswarm выполняют лучше для больших диапазонов настройки параметра, поскольку они - глобальные оптимизаторы. С другой стороны, patternsearch и simulannealbnd выполняют лучше для маленьких областей значений параметра, поскольку они - локальные оптимизаторы. Если правила уже добавляются к дереву FIS с помощью данных тренировки, то patternsearch и simulannealbnd могут произвести более быструю сходимость по сравнению с ga и particleswarm. Для получения дополнительной информации об этих методах оптимизации и их опциях, смотрите ga, particleswarm, patternsearch и simulannealbnd.

  • Изменяя свойства FIS, такие как тип FIS, количество входных параметров, количество MFS ввода/вывода, типов MF и количества правил. Для нечетких систем с большим количеством входных параметров Sugeno FIS обычно сходится быстрее, чем Mamdani FIS, поскольку система Sugeno имеет меньше параметров вывода MF (если MFS constant используется), и быстрее defuzzification. Небольшие числа MFS и правил сокращают количество параметров, чтобы настроиться, производя более быстрый настраивающий процесс. Кроме того, большое количество правил может сверхсоответствовать данным тренировки.

  • Изменение настроек настраиваемого параметра для MFS и правил. Например, можно настроить поддержку треугольного MF, не изменяя его пиковое местоположение. Выполнение так сокращает количество настраиваемых параметров и может произвести более быстрый настраивающий процесс для определенных приложений. Для правил можно исключить нулевые индексы MF путем установки AllowEmpty настраиваемая установка на false, который сокращает общее количество правил во время фазы изучения.

  • Изменяя свойства дерева FIS, такие как количество нечетких систем и связей между нечеткими системами.

  • Используя различный рейтинг и группировку входных параметров к дереву FIS.

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)

% Evaluate FIS
actY = evaluateFIS(fis,x);

% Calculate RMSE
del = actY - y;
rmse = sqrt(mean(del.^2));

end

function y = evaluateFIS(fis,x)

% Specify options for FIS evaluation
persistent evalOptions
if isempty(evalOptions)
    evalOptions = evalfisOptions("EmptyOutputFuzzySetMessage","none", ...
        "NoRuleFiredMessage","none","OutOfRangeInputValueMessage","none");
end

% Evaluate FIS
y = evalfis(fis,x,evalOptions);

end

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

| | |

Похожие темы