В этом примере показано, как настроить параметры дерева FIS, представляющего собой совокупность связанных нечетких систем вывода. В этом примере используется оптимизация роя частиц и поиска шаблона, для которой требуется программное обеспечение Global Optimization Toolbox™.
Прогнозирование потребления автомобильного топлива в милях на галлон (MPG) является типичной проблемой нелинейной регрессии. Для прогнозирования расхода топлива используется несколько атрибутов профиля автомобиля. Данные обучения имеются в репозитории машинного обучения Университета Калифорнии в Ирвайне и содержат данные, собранные с автомобилей различных марок и моделей.
В этом примере для прогнозирования атрибута выходных данных MPG с деревом FIS используются следующие шесть атрибутов входных данных:
Количество баллонов
Смещение
Лошадиная сила
Вес
Ускорение
Модельный год
Загрузите данные. Каждая строка набора данных, полученная из репозитория, представляет собой отдельный профиль автомобиля.
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 с использованием ранжированных входных атрибутов.
Создайте дерево FIS из объектов FIS.
Ранговые входы в соответствии с коэффициентами корреляции
Вычислите коэффициенты корреляции для обучающих данных. В последней строке корреляционной матрицы первые шесть элементов показывают коэффициенты корреляции между шестью атрибутами пут-данных и атрибутом вывода.
c1 = corrcoef(data); c1(end,:)
ans = 1×7
-0.7776 -0.8051 -0.7784 -0.8322 0.4233 0.5805 1.0000
Первые четыре входных атрибута имеют отрицательные значения, а последние два входных атрибута имеют положительные значения.
Ранжируйте входные атрибуты, имеющие отрицательные корреляции в порядке убывания, по абсолютному значению их коэффициентов корреляции.
Вес
Смещение
Лошадиная сила
Количество баллонов
Ранжируйте входные атрибуты, имеющие положительные корреляции в порядке убывания, по абсолютному значению их коэффициентов корреляции.
Модельный год
Ускорение
Эти рейтинги показывают, что вес и модельный год имеют самую высокую отрицательную и положительную корреляцию с 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.
Настройка выполняется в два этапа.
Изучение базы правил при сохранении параметров ввода и вывода MF постоянными.
Настройте параметры 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)

Настройка всех параметров
Изучив новые правила, настройте параметры 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)

Настройка параметров дерева 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.9541 0.8245 -0.8427 1.0000
Последняя строка корреляционной матрицы показывает, что выходы fis1 и fis3 (первый и третий столбцы соответственно) имеют более высокую корреляцию с конечным выходом по сравнению с выходом fis2 (вторая колонка). Этот результат показывает, что упрощение дерева FIS путем удаления fis2 и fis4 и потенциально может дать аналогичные результаты обучения по сравнению с исходной древовидной структурой.
Удалить 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, используя четыре входных атрибута проверочного набора данных.
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, количество входов, количество входов/выходов 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
fistree | getTunableSettings | sugfis | tunefis