Этот пример показывает, как к настройкам параметров дерева FIS, которое является набором связанных нечетких систем вывода. Этот пример использует рой частицы и оптимизацию поиска шаблона, которые требуют программного обеспечения Global Optimization Toolbox™.
Автомобильный прогноз расхода топлива в милях на галлон (MPG) является типичной нелинейной проблемой регрессии. Это использует несколько автомобильных атрибутов профиля, чтобы предсказать расход топлива. Данные тренировки доступны в Калифорнийском университете в Репозитории Машинного обучения Ирвина и содержат данные, собранные от автомобилей различных, делает и модели.
Этот пример использует следующие шесть атрибутов входных данных, чтобы предсказать, что выходные данные приписывают MPG с деревом FIS:
Количество цилиндров
Смещение
Лошадиная сила
Вес
Ускорение
Модельный год
Загрузите данные. Каждая строка набора данных, полученного из репозитория, представляет различный автомобильный профиль.
data = loadgas;
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: FIS: [1×5 sugfis] Connections: [4×2 string] Inputs: [6×1 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
, year
, displacement
, acceleration
, horsepower
и cylinders
.
inputOrders1 = [4 6 2 5 3 1]; orderedTrnX1 = trnX(:,inputOrders1);
Изучение правил с функцией tunefis
занимает приблизительно 4 минуты. В данном примере позвольте настроиться установкой runtunefis
на true
. Чтобы загрузить предварительно обученные результаты, не запуская tunefis
, можно установить runtunefis
на false
.
runtunefis = true;
Установки параметров могут быть пустыми при изучении новых правил. Для получения дополнительной информации смотрите tunefis
.
if runtunefis fisTout1 = tunefis(fisTin,[],orderedTrnX1,trnY,options); else tunedfis = load('tunedfistreempgprediction.mat'); %#ok<UNRCH> fisTout1 = tunedfis.fisTout1; fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout1,orderedTrnX1,trnY)); end
Best Mean Stall Iteration f-count f(x) f(x) Iterations 0 100 5.697 12.63 0 1 200 5.697 14.45 0 2 300 5.222 12.26 0 3 400 5.222 13.44 1 4 500 5.222 12.9 2 5 600 4.944 12.19 0 6 700 4.944 12.2 1 7 800 4.563 13.31 0 8 900 4.563 12.92 1 9 1000 4.563 12.06 2 10 1100 4.563 13.32 3 11 1200 4.563 11.82 4 12 1300 4.563 13.04 5 13 1400 4.563 12.2 6 14 1500 4.563 11.94 7 15 1600 4.563 11.33 8 16 1700 4.563 10.71 9 17 1800 4.538 11.39 0 18 1900 4.538 11.27 1 19 2000 4.538 11.32 2 20 2100 4.538 11.26 3 21 2200 4.538 11.07 4 22 2300 4.538 10.53 5 23 2400 4.538 10.15 6 24 2500 4.538 10.66 7 25 2600 4.452 10.28 0 26 2700 4.408 10.42 0 27 2800 4.243 9.661 0 28 2900 4.061 9.153 0 29 3000 4.061 9.849 1 30 3100 4.024 9.029 0 Best Mean Stall Iteration f-count f(x) f(x) Iterations 31 3200 4.024 9.91 1 32 3300 4.024 8.847 2 33 3400 3.996 8.684 0 34 3500 3.991 8.674 0 35 3600 3.569 9.125 0 36 3700 3.569 8.942 1 37 3800 3.512 8.21 0 38 3900 3.512 8.262 1 39 4000 3.512 8.452 2 40 4100 3.485 8.343 0 41 4200 3.485 8.451 1 42 4300 3.437 8.52 0 43 4400 3.425 8.136 0 44 4500 3.425 8.254 1 45 4600 3.423 8.065 0 46 4700 3.423 7.6 1 47 4800 3.417 7.586 0 48 4900 3.399 7.546 0 49 5000 3.399 7.335 1 50 5100 3.399 7.816 2 Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.
Столбец 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;
Настройте древовидные параметры FIS с помощью заданных настраиваемых настроек, данных тренировки, и настроив опции.
Настройка значений параметров с функцией tunefis
занимает несколько минут. Чтобы загрузить предварительно обученные результаты, не запуская tunefis
, можно установить runtunefis
на false
.
rng('default') if runtunefis fisTout2 = tunefis(fisTout1,[in;out;rule],orderedTrnX1,trnY,options); else fisTout2 = tunedfis.fisTout2; %#ok<UNRCH> fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout2,orderedTrnX1,trnY)); end
Iter Func-count f(x) MeshSize Method 0 1 3.56396 1 1 2 3.56389 2 Successful Poll 2 3 3.56374 4 Successful Poll 3 4 3.56344 8 Successful Poll 4 5 3.56285 16 Successful Poll 5 6 3.56172 32 Successful Poll 6 7 3.5596 64 Successful Poll 7 8 3.556 128 Successful Poll 8 9 3.55073 256 Successful Poll 9 10 3.5431 512 Successful Poll 10 17 3.5431 256 Refine Mesh 11 27 3.54 512 Successful Poll 12 34 3.54 256 Refine Mesh 13 48 3.54 128 Refine Mesh 14 50 3.53968 256 Successful Poll 15 55 3.53961 512 Successful Poll 16 62 3.53961 256 Refine Mesh 17 76 3.53961 128 Refine Mesh 18 84 3.35952 256 Successful Poll 19 86 3.35153 512 Successful Poll 20 93 3.35078 1024 Successful Poll 21 99 3.35078 512 Refine Mesh 22 107 3.35078 256 Refine Mesh 23 120 3.35078 128 Refine Mesh 24 141 3.34063 256 Successful Poll 25 150 3.33599 512 Successful Poll 26 158 3.33599 256 Refine Mesh 27 172 3.33599 128 Refine Mesh 28 181 3.33546 256 Successful Poll 29 194 3.33546 128 Refine Mesh 30 217 3.3198 256 Successful Poll Iter Func-count f(x) MeshSize Method 31 230 3.3198 128 Refine Mesh 32 240 3.31883 256 Successful Poll 33 253 3.31883 128 Refine Mesh 34 275 3.31883 64 Refine Mesh 35 276 3.316 128 Successful Poll 36 298 3.316 64 Refine Mesh 37 321 3.316 32 Refine Mesh 38 329 3.31085 64 Successful Poll 39 347 3.30905 128 Successful Poll 40 348 3.30398 256 Successful Poll 41 361 3.30398 128 Refine Mesh 42 383 3.30398 64 Refine Mesh 43 408 3.30398 32 Refine Mesh 44 460 3.30398 16 Refine Mesh 45 467 3.30375 32 Successful Poll 46 519 3.30375 16 Refine Mesh 47 532 3.30329 32 Successful Poll 48 584 3.30329 16 Refine Mesh 49 598 3.28079 32 Successful Poll 50 608 3.28036 64 Successful Poll 51 630 3.27888 128 Successful Poll 52 639 3.27672 256 Successful Poll 53 652 3.27672 128 Refine Mesh 54 672 3.27672 64 Refine Mesh 55 697 3.27672 32 Refine Mesh 56 750 3.27672 16 Refine Mesh 57 779 3.27535 32 Successful Poll 58 832 3.27535 16 Refine Mesh 59 863 3.27182 32 Successful Poll 60 910 3.26985 64 Successful Poll Iter Func-count f(x) MeshSize Method 61 935 3.26985 32 Refine Mesh 62 988 3.26985 16 Refine Mesh 63 1064 3.26985 8 Refine Mesh 64 1066 3.26957 16 Successful Poll 65 1142 3.26957 8 Refine Mesh 66 1155 3.26792 16 Successful Poll 67 1231 3.26792 8 Refine Mesh 68 1247 3.26139 16 Successful Poll 69 1323 3.26139 8 Refine Mesh 70 1421 3.26139 4 Refine Mesh 71 1422 3.26118 8 Successful Poll 72 1520 3.26118 4 Refine Mesh 73 1522 3.26095 8 Successful Poll 74 1620 3.26095 4 Refine Mesh 75 1633 3.26094 8 Successful Poll 76 1731 3.26094 4 Refine Mesh Maximum number of iterations exceeded: increase options.MaxIterations.
В конце настраивающего процесса учебная ошибка уменьшает по сравнению с предыдущим шагом.
Подтвердите производительность настроенного дерева 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.9724 0.7935 -0.8156 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); else fisTout4 = tunedfis.fisTout4; %#ok<UNRCH> fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout4,orderedTrnX2,trnY)); end
Best Mean Stall Iteration f-count f(x) f(x) Iterations 0 100 5.592 11.74 0 1 200 5.592 13.89 0 2 300 5.278 12.52 0 3 400 4.84 11.89 0 4 500 4.84 12.98 1 5 600 3.803 11.59 0 6 700 3.803 12.25 1 7 800 3.803 11.88 2 8 900 3.803 12.28 3 9 1000 3.17 11.53 0 10 1100 3.17 12.09 1 11 1200 3.17 11.92 2 12 1300 3.17 11.38 3 13 1400 3.17 11.89 4 14 1500 3.17 10.51 5 15 1600 3.17 9.628 6 16 1700 3.17 9.383 7 17 1800 3.17 8.849 8 18 1900 3.17 8.35 9 19 2000 3.17 8.374 10 20 2100 3.163 7.869 0 21 2200 3.163 7.388 1 22 2300 3.163 7.35 2 23 2400 3.163 7.067 3 24 2500 3.163 7.111 4 25 2600 3.163 6.967 5 26 2700 3.085 6.565 0 27 2800 3.004 6.608 0 28 2900 3.004 6.321 1 29 3000 2.983 6.008 0 30 3100 2.983 5.986 1 Best Mean Stall Iteration f-count f(x) f(x) Iterations 31 3200 2.983 6.467 2 32 3300 2.983 5.947 3 33 3400 2.977 5.921 0 34 3500 2.977 5.44 1 35 3600 2.977 5.796 2 36 3700 2.977 5.591 3 37 3800 2.977 5.492 4 38 3900 2.977 5.521 5 39 4000 2.977 5.628 6 40 4100 2.977 5.931 7 41 4200 2.943 5.258 0 42 4300 2.943 5.904 1 43 4400 2.943 6.198 2 44 4500 2.929 5.612 0 45 4600 2.929 5.587 1 46 4700 2.929 5.715 2 47 4800 2.929 5.525 3 48 4900 2.929 5.506 4 49 5000 2.929 5.336 5 50 5100 2.929 5.493 6 Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.
В учебной фазе настраиваются параметры функции принадлежности и правил.
options.Method = "patternsearch"; options.OptimizationType = "tuning"; options.MethodOptions.MaxIterations = 75; [in,out,rule] = getTunableSettings(fisTout4); rng('default') if runtunefis fisTout5 = tunefis(fisTout4,[in;out;rule],orderedTrnX2,trnY,options); else fisTout5 = tunedfis.fisTout5; %#ok<UNRCH> fprintf('Training RMSE = %.3f MPG\n',calculateRMSE(fisTout5,orderedTrnX2,trnY)); end
Iter Func-count f(x) MeshSize Method 0 1 2.92888 1 1 2 2.92888 2 Successful Poll 2 3 2.92887 4 Successful Poll 3 4 2.92884 8 Successful Poll 4 5 2.92881 16 Successful Poll 5 6 2.92879 32 Successful Poll 6 14 2.9117 64 Successful Poll 7 15 2.91093 128 Successful Poll 8 22 2.90552 256 Successful Poll 9 23 2.88691 512 Successful Poll 10 29 2.88691 256 Refine Mesh 11 37 2.88691 128 Refine Mesh 12 38 2.88549 256 Successful Poll 13 46 2.88549 128 Refine Mesh 14 59 2.88549 64 Refine Mesh 15 65 2.88521 128 Successful Poll 16 78 2.88521 64 Refine Mesh 17 80 2.8825 128 Successful Poll 18 85 2.87991 256 Successful Poll 19 93 2.87991 128 Refine Mesh 20 106 2.87991 64 Refine Mesh 21 119 2.87526 128 Successful Poll 22 131 2.87526 64 Refine Mesh 23 147 2.87526 32 Refine Mesh 24 154 2.87514 64 Successful Poll 25 170 2.87514 32 Refine Mesh 26 180 2.86842 64 Successful Poll 27 187 2.86722 128 Successful Poll 28 200 2.86722 64 Refine Mesh 29 207 2.86719 128 Successful Poll 30 220 2.86719 64 Refine Mesh Iter Func-count f(x) MeshSize Method 31 235 2.86719 32 Refine Mesh 32 236 2.86708 64 Successful Poll 33 251 2.86708 32 Refine Mesh 34 260 2.86638 64 Successful Poll 35 261 2.86515 128 Successful Poll 36 274 2.86515 64 Refine Mesh 37 289 2.86515 32 Refine Mesh 38 290 2.86501 64 Successful Poll 39 305 2.86501 32 Refine Mesh 40 336 2.86501 16 Refine Mesh 41 339 2.85839 32 Successful Poll 42 370 2.85839 16 Refine Mesh 43 374 2.85824 32 Successful Poll 44 405 2.85824 16 Refine Mesh 45 417 2.85823 32 Successful Poll 46 448 2.85823 16 Refine Mesh 47 490 2.85823 8 Refine Mesh 48 491 2.85822 16 Successful Poll 49 533 2.85822 8 Refine Mesh 50 535 2.85806 16 Successful Poll 51 547 2.85797 32 Successful Poll 52 578 2.85797 16 Refine Mesh 53 590 2.85796 32 Successful Poll 54 621 2.85796 16 Refine Mesh 55 663 2.85796 8 Refine Mesh 56 664 2.85795 16 Successful Poll 57 706 2.85795 8 Refine Mesh 58 711 2.8579 16 Successful Poll 59 753 2.8579 8 Refine Mesh 60 759 2.85743 16 Successful Poll Iter Func-count f(x) MeshSize Method 61 771 2.85698 32 Successful Poll 62 778 2.85633 64 Successful Poll 63 785 2.85584 128 Successful Poll 64 797 2.85584 64 Refine Mesh 65 813 2.85584 32 Refine Mesh 66 844 2.85584 16 Refine Mesh 67 886 2.85584 8 Refine Mesh 68 904 2.85548 16 Successful Poll 69 905 2.85539 32 Successful Poll 70 936 2.85539 16 Refine Mesh 71 937 2.85538 32 Successful Poll 72 968 2.85538 16 Refine Mesh 73 1010 2.85538 8 Refine Mesh 74 1026 2.85537 16 Successful Poll 75 1068 2.85537 8 Refine Mesh 76 1090 2.82832 16 Successful Poll Maximum number of iterations exceeded: increase options.MaxIterations.
В конце настраивающего процесса дерево 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, количество входных параметров, количество MFS ввода/вывода, типов MF и количества правил. Для нечетких систем с большим количеством входных параметров Sugeno FIS обычно сходится быстрее, чем Mamdani FIS, поскольку система Sugeno имеет меньше параметров вывода MF (если MFS constant
используется), и быстрее defuzzification. Небольшие числа 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
fistree
| getTunableSettings
| sugfis
| tunefis