В этом примере показано, как к настройкам параметров дерева 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
.
Входные атрибуты со значениями отрицательной и положительной корреляции разделены на пары, чтобы объединить и положительные и отрицательные эффекты на выход для предсказания. Входные параметры сгруппированы согласно их рангам можно следующим образом:
Вес и модельный год
Смещение и ускорение
Лошадиная сила и количество цилиндров
Последняя группа включает только входные параметры со значениями отрицательной корреляции, поскольку существует только два входных параметров со значениями положительной корреляции.
Этот пример использует 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: Name: "fistreemodel" FIS: [1x5 sugfis] Connections: [4x2 string] Inputs: [6x1 string] Outputs: "fis5/mpg" DisableStructuralChecks: 0 See 'getTunableSettings' method for parameter optimization.
Настройка выполняется на двух шагах.
Изучите основу правила при хранении параметров MF ввода и вывода постоянными.
Настройте параметры 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; rmseValue = calculateRMSE(fisTout1,orderedTrnX1,trnY); fprintf('Training RMSE = %.3f MPG\n',rmseValue); 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
к истине.
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; rmseValue = calculateRMSE(fisTout2,orderedTrnX1,trnY); fprintf('Training RMSE = %.3f MPG\n',rmseValue); 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; rmseValue = calculateRMSE(fisTout4,orderedTrnX2,trnY); fprintf('Training RMSE = %.3f MPG\n',rmseValue); 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; rmseValue = calculateRMSE(fisTout5,orderedTrnX2,trnY); fprintf('Training RMSE = %.3f MPG\n',rmseValue); 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
(Global Optimization Toolbox), particleswarm
(Global Optimization Toolbox), patternsearch
(Global Optimization Toolbox) и simulannealbnd
(Global Optimization Toolbox).
Изменяя свойства FIS, такие как тип FIS, количество входных параметров, количество MFS ввода/вывода, типов MF и количества правил. Для нечетких систем с большим количеством входных параметров Sugeno FIS обычно сходится быстрее, чем Mamdani FIS, поскольку система Sugeno имеет меньше параметров выхода MF (если constant
MFS используется), и более быстрая дефаззификация. Небольшие числа 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
tunefis
| sugfis
| getTunableSettings
| fistree