В этом примере показано, как настроить параметры дерева FIS с помощью двухшагового процесса. Дополнительные сведения об аналогичном двухшаговом процессе см. в разделе Настройка нечетких систем вывода.
Изучение и настройка правил FIS в дереве.
Изучите параметры MF FIS в дереве.
Создайте дерево FIS для моделирования exp (x), как показано на следующем рисунке. Дополнительные сведения о создании деревьев FIS см. в разделе Нечеткие деревья.

Создать fis1 как FIS Sugeno-типа, что приводит к более быстрому процессу настройки по сравнению с системой Mamdani, благодаря ее вычислительно эффективному методу дефузификации. Добавьте два входа с диапазоном [0, 10] и с тремя MF каждый. Используйте гладкую, дифференцируемую MF, такую как gaussmf, для соответствия характеристикам моделируемого типа данных.
fis1 = sugfis('Name','fis1'); fis1 = addInput(fis1,[0 10],'NumMFs',3,'MFType','gaussmf'); fis1 = addInput(fis1,[0 10],'NumMFs',3,'MFType','gaussmf');
Добавьте продукцию с диапазоном [-1.5, 1.5] наличие девяти соответствий MFs девяти возможным входным комбинациям MF. Это обеспечивает максимальную детализацию правил FIS. Задайте диапазон вывода в соответствии с возможными значениями (x).
fis1 = addOutput(fis1,[-1.5 1.5],'NumMFs',9);Создать fis2 как FIS Sugeno-типа. Добавьте два входа. Установите диапазон первого входа в значение [-1.5, 1.5], соответствующее диапазону выхода fis1. Второй вход совпадает с входами fis1. Поэтому используйте тот же диапазон ввода, [0, 10]. Добавьте три MF для каждого из входов.
fis2 = sugfis('Name','fis2'); fis2 = addInput(fis2,[-1.5 1.5],'NumMFs',3,'MFType','gaussmf'); fis2 = addInput(fis2,[0 10],'NumMFs',3,'MFType','gaussmf');
Добавьте выход с диапазоном [0, 1] и девятью MF. Выходной диапазон устанавливается в соответствии с возможными значениями exp (x).
fis2 = addOutput(fis2,[0 1],'NumMFs',9);Подключите входы и выходы, как показано на схеме. Первый выход fis1, output1, подключается к первому входу fis2, input1. Входы fis1 соединяются друг с другом, и второй вход fis1 подключается ко второму входу fis2.
con1 = ["fis1/output1" "fis2/input1"]; con2 = ["fis1/input1" "fis1/input2"]; con3 = ["fis1/input2" "fis2/input2"];
Наконец, создайте дерево FIS с использованием указанных FIS и соединений.
fisT = fistree([fis1 fis2],[con1;con2;con3]);
Добавьте дополнительный вывод в дерево FIS для доступа к выходу fis1.
fisT.Outputs = ["fis1/output1";fisT.Outputs];Создание входных и выходных учебных данных.
x = (0:0.1:10)'; y1 = sin(x)+cos(x); y2 = y1./exp(x); y = [y1 y2];
Настройте параметры дерева FIS за два шага. Сначала изучите правила дерева FIS с помощью метода глобальной оптимизации. Для этого примера используйте рой частиц.
options = tunefisOptions('Method','particleswarm','OptimizationType','learning');
На этом этапе настройки используется небольшое количество итераций для изучения базы правил без переопределения данных обучения. База правил предоставляет образованное начальное условие, которое на втором шаге можно использовать для совместной оптимизации всех параметров дерева FIS. Установите максимальное число итераций равным 5 и изучите базу правил.
options.MethodOptions.MaxIterations = 5; rng('default') % for reproducibility fisTout1 = tunefis(fisT,[],x,y,options);
Best Mean Stall
Iteration f-count f(x) f(x) Iterations
0 100 0.6682 0.9395 0
1 200 0.6682 1.023 0
2 300 0.6652 0.9308 0
3 400 0.6259 0.958 0
4 500 0.6259 0.918 1
5 600 0.5969 0.9179 0
Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.
Затем, чтобы настроить все параметры дерева FIS одновременно, используйте метод локальной оптимизации. В этом примере используется поиск по образцу. Локальная оптимизация обычно выполняется быстрее, чем глобальная оптимизация, и может дать лучшие результаты, когда входные нечеткие параметры системы уже согласуются с данными обучения.
Используйте patternsearch способ оптимизации. Установите число итераций равным 25.
options.Method = 'patternsearch';
options.MethodOptions.MaxIterations = 25;Использовать getTunableSettings для получения параметров ввода, вывода и правила из дерева FIS.
[in,out,rule] = getTunableSettings(fisTout1);
Настройте параметры дерева FIS.
rng('default') % for reproducibility fisTout2 = tunefis(fisTout1,[in;out;rule],x,y,options);
Iter Func-count f(x) MeshSize Method
0 1 0.596926 1
1 3 0.551284 2 Successful Poll
2 13 0.548551 4 Successful Poll
3 20 0.546331 8 Successful Poll
4 33 0.527482 16 Successful Poll
5 33 0.527482 8 Refine Mesh
6 61 0.511532 16 Successful Poll
7 61 0.511532 8 Refine Mesh
8 92 0.505355 16 Successful Poll
9 92 0.505355 8 Refine Mesh
10 128 0.505355 4 Refine Mesh
11 175 0.487734 8 Successful Poll
12 212 0.487734 4 Refine Mesh
13 265 0.487734 2 Refine Mesh
14 275 0.486926 4 Successful Poll
15 328 0.486926 2 Refine Mesh
16 339 0.483683 4 Successful Poll
17 391 0.483683 2 Refine Mesh
18 410 0.442624 4 Successful Poll
19 462 0.442624 2 Refine Mesh
20 469 0.44051 4 Successful Poll
21 521 0.44051 2 Refine Mesh
22 542 0.435381 4 Successful Poll
23 594 0.435381 2 Refine Mesh
24 614 0.398872 4 Successful Poll
25 662 0.398385 8 Successful Poll
26 698 0.398385 4 Refine Mesh
Maximum number of iterations exceeded: increase options.MaxIterations.
На втором этапе затраты на оптимизацию снижаются с 0,60 до 0,40.
Кроме того, можно настроить определенные нечеткие системы отдельно в дереве FIS. Для этого примера, изучив базу правил дерева FIS, отдельно настройте fis1 и fis2 параметры.
Для получения настроек параметров FIS в дереве FIS используйте getTunableSettings, указывая имя FIS. Сначала получите параметры настройки для fis1.
[in,out,rule] = getTunableSettings(fisTout1,"FIS","fis1");
Настройка параметров fis1.
rng('default')
fisTout2 = tunefis(fisTout1,[in;out;rule],x,y,options);Iter Func-count f(x) MeshSize Method
0 1 0.596926 1
1 3 0.551284 2 Successful Poll
2 18 0.510362 4 Successful Poll
3 28 0.494804 8 Successful Poll
4 56 0.494804 4 Refine Mesh
5 84 0.493422 8 Successful Poll
6 107 0.492883 16 Successful Poll
7 107 0.492883 8 Refine Mesh
8 136 0.492883 4 Refine Mesh
9 171 0.492883 2 Refine Mesh
10 178 0.491534 4 Successful Poll
11 213 0.491534 2 Refine Mesh
12 229 0.482682 4 Successful Poll
13 264 0.482682 2 Refine Mesh
14 279 0.446645 4 Successful Poll
15 313 0.446645 2 Refine Mesh
16 330 0.44657 4 Successful Poll
17 364 0.44657 2 Refine Mesh
18 384 0.446495 4 Successful Poll
19 418 0.446495 2 Refine Mesh
20 461 0.445938 4 Successful Poll
21 495 0.445938 2 Refine Mesh
22 560 0.422421 4 Successful Poll
23 594 0.422421 2 Refine Mesh
24 597 0.397265 4 Successful Poll
25 630 0.397265 2 Refine Mesh
26 701 0.390338 4 Successful Poll
Maximum number of iterations exceeded: increase options.MaxIterations.
В этом случае стоимость оптимизации повышается за счет настройки только fis1 значения параметров.
Затем получите параметры настройки для fis2 и настроить fis2 параметры.
[in,out,rule] = getTunableSettings(fisTout2,"FIS","fis2"); rng('default') fisTout3 = tunefis(fisTout2,[in;out;rule],x,y,options);
Iter Func-count f(x) MeshSize Method
0 1 0.390338 1
1 2 0.374103 2 Successful Poll
2 5 0.373855 4 Successful Poll
3 10 0.356619 8 Successful Poll
4 33 0.356619 4 Refine Mesh
5 43 0.350715 8 Successful Poll
6 65 0.349417 16 Successful Poll
7 65 0.349417 8 Refine Mesh
8 87 0.349417 4 Refine Mesh
9 91 0.349356 8 Successful Poll
10 112 0.349356 4 Refine Mesh
11 138 0.346102 8 Successful Poll
12 159 0.346102 4 Refine Mesh
13 172 0.345938 8 Successful Poll
14 193 0.345938 4 Refine Mesh
15 222 0.342721 8 Successful Poll
16 244 0.342721 4 Refine Mesh
17 275 0.342721 2 Refine Mesh
18 283 0.340727 4 Successful Poll
19 312 0.340554 8 Successful Poll
20 335 0.340554 4 Refine Mesh
21 366 0.340554 2 Refine Mesh
22 427 0.337873 4 Successful Poll
23 457 0.337873 2 Refine Mesh
24 521 0.33706 4 Successful Poll
25 551 0.33706 2 Refine Mesh
26 624 0.333193 4 Successful Poll
Maximum number of iterations exceeded: increase options.MaxIterations.
Затраты на оптимизацию дополнительно снижаются за счет настройки fis2 значения параметров. Во избежание переоборудования отдельных значений параметров FIS можно дополнительно настроить оба параметра: fis1 и fis2 параметры вместе.
[in,out,rule] = getTunableSettings(fisTout3);
rng('default')
fisTout4 = tunefis(fisTout3,[in;out;rule],x,y,options);Iter Func-count f(x) MeshSize Method
0 1 0.333193 1
1 8 0.326804 2 Successful Poll
2 91 0.326432 4 Successful Poll
3 116 0.326261 8 Successful Poll
4 154 0.326261 4 Refine Mesh
5 205 0.326261 2 Refine Mesh
6 302 0.326092 4 Successful Poll
7 352 0.326092 2 Refine Mesh
8 391 0.325964 4 Successful Poll
9 441 0.325964 2 Refine Mesh
10 478 0.32578 4 Successful Poll
11 528 0.32578 2 Refine Mesh
12 562 0.325691 4 Successful Poll
13 612 0.325691 2 Refine Mesh
14 713 0.229273 4 Successful Poll
15 763 0.229273 2 Refine Mesh
16 867 0.22891 4 Successful Poll
17 917 0.22891 2 Refine Mesh
18 1036 0.228688 4 Successful Poll
19 1086 0.228688 2 Refine Mesh
20 1212 0.228688 1 Refine Mesh
21 1266 0.228445 2 Successful Poll
22 1369 0.228441 4 Successful Poll
23 1381 0.227645 8 Successful Poll
24 1407 0.226125 16 Successful Poll
25 1407 0.226125 8 Refine Mesh
26 1447 0.226125 4 Refine Mesh
Maximum number of iterations exceeded: increase options.MaxIterations.
В целом, затраты на оптимизацию меньше после использования трех шагов настройки, чем после использования только одного.