В этом примере показано, как настроить параметры дерева FIS, которое является набором связанных систем нечеткого вывода. Этот пример использует оптимизацию поиска частиц и шаблонов, которая требует программного обеспечения Global Optimization Toolbox™.
Предсказание потребления автомобильного топлива в милях на галлон (MPG) является типичной нелинейной задачей регрессии. Он использует несколько атрибутов профиля автомобиля, чтобы предсказать расход топлива. Обучающие данные доступны в Калифорнийском университете в Irvine Machine Learning Repository и содержат данные, собранные с автомобилей различных марок и моделей.
Этот пример использует следующие шесть атрибутов входных данных для предсказания атрибута выходных данных 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 для более быстрой оценки в процессе настройки по сравнению с системами Мамдани. Каждый 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.
Настройка выполняется в два этапа.
Изучение основы правила при сохранении входа и выходных параметров 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
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)

Настройка всех параметров
После изучения новых правил настройте параметры входного/выходного 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 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 и потенциально может привести к аналогичным результатам обучения по сравнению с исходной древовидной структурой.
Удаление 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 с помощью четырех входных атрибутов проверяющего набора данных.
orderedVldX2 = vldX(:,inputOrders2); plotActualAndExpectedResultsWithRMSE(fisTout5,orderedVldX2,vldY)

Упрощенное дерево 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
fistree | getTunableSettings | sugfis | tunefis