В этом примере показано, как настроить параметры дерева 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