Настройте дерево 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: [1x5 sugfis]
                Connections: [4x2 string]
                     Inputs: [6x1 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год, displacement, acceleration, horsepower, и cylinders.

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

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

runtunefis = false;

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

if runtunefis
    fisTout1 = tunefis(fisTin,[],orderedTrnX1,trnY,options); %#ok<UNRCH>
else
    tunedfis = load('tunedfistreempgprediction.mat');
    fisTout1 = tunedfis.fisTout1;
    fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout1,orderedTrnX1,trnY));
end
Training RMSE = 3.399 MPG

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); %#ok<UNRCH>
else
    fisTout2 = tunedfis.fisTout2;
    fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout2,orderedTrnX1,trnY));
end
Training RMSE = 3.261 MPG

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

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

Подтвердите производительность настроенного дерева 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); %#ok<UNRCH>
else
    fisTout4 = tunedfis.fisTout4;
    fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout4,orderedTrnX2,trnY));
end
Training RMSE = 2.929 MPG

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

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); %#ok<UNRCH>
else
    fisTout5 = tunedfis.fisTout5;
    fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout5,orderedTrnX2,trnY));
end
Training RMSE = 2.828 MPG

В конце настраивающего процесса дерево 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 (если constant MFS используется), и быстрее defuzzification. Небольшие числа MFS и правил сокращают количество параметров, чтобы настроиться, производя более быстрый настраивающий процесс. Кроме того, большое количество правил может сверхсоответствовать обучающим данным.

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

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

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

Локальные функции

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

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

| | |

Похожие темы