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

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

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

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

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

  2. Смещение

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

  4. Вес

  5. Ускорение

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

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

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

data = loadGasData;

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.

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

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

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

  • Мощность и количество цилиндров

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

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

Первый FIS объединяет атрибуты weight и model year.

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

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

Правила обучения

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

The 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)

Figure contains 2 axes. Axes 1 with title RMSE = 3.4626 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(fisTout1);

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

options.OptimizationType = 'tuning';

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

options.Method = 'patternsearch';

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

options.MethodOptions.MaxIterations = 75;

Чтобы улучшить результаты поиска шаблона, установите опцию метода UseCompletePoll к true.

options.MethodOptions.UseCompletePoll = true;

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

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

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

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

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

plotActualAndExpectedResultsWithRMSE(fisTout2,orderedVldX1,vldY)

Figure contains 2 axes. Axes 1 with title RMSE = 3.3501 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. В данном примере для доступа к промежуточным выходам 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")

Figure contains an axes. The axes with title Intermediate and Final Outputs contains 4 objects of type line. These objects represent Output of fis1, Output of fis2, Output of fis3, Output of fis5.

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

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

    0.9541    0.8245   -0.8427    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 = 3.380 MPG

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

options.Method = "patternsearch";
options.OptimizationType = "tuning";
options.MethodOptions.MaxIterations = 75;
options.MethodOptions.UseCompletePoll = true;
[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 = 3.049 MPG

В конце процесса настройки дерево FIS содержит обновленные значения параметров MF и rule. Размер основы правил нового строения дерева 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)

Figure contains 2 axes. Axes 1 with title RMSE = 3.1524 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 может быть представлено с меньшим количеством входов и правил для обобщения обучающих данных.

Заключение

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

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

  • Использование методов глобальной оптимизации, таких как ga и particleswarm, как в фазах обучения правилам, так и в фазах настройки параметров. ga и particleswarm лучше для больших областей значений настройки параметров, так как они являются глобальными оптимизаторами. С другой стороны patternsearch и simulannealbnd лучше для небольших областей значений параметров, так как они являются локальными оптимизаторами. Если правила уже добавлены в дерево 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 и правил сокращают количество параметров для настройки, создавая более быстрый процесс настройки. Кроме того, большое количество правил может перегружать обучающие данные.

  • Изменение настроек настраиваемых параметров для MF и правил. Например, можно настроить поддержку треугольной 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

См. также

| | |

Похожие темы