exponenta event banner

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

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

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

В этом примере для прогнозирования атрибута выходных данных 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 для более быстрой оценки в процессе настройки по сравнению с системами Mamdani. Каждый FIS включает в себя два входа и один выход, где каждый вход содержит две треугольные функции членства (MF) по умолчанию, а выход включает в себя 4 постоянных MF по умолчанию. Укажите входные и выходные диапазоны, используя соответствующие диапазоны атрибутов данных.

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

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 выход), по-видимому, сильно коррелирует с выходами 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 и правил. Базовый размер правила для новой конфигурации дерева 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 (инструментарий глобальной оптимизации), particleswarm (инструментарий глобальной оптимизации), patternsearch(Панель инструментов глобальной оптимизации), и simulannealbnd(Панель инструментов глобальной оптимизации).

  • Изменение свойств FIS, таких как тип FIS, количество входов, количество входов/выходов MF, типы MF и количество правил. Для нечетких систем с большим количеством входов FIS Sugeno обычно сходится быстрее, чем FIS Mamdani, поскольку система 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

См. также

| | |

Связанные темы