В этом примере показано, как настроить систему нечеткого вывода (FIS). Использование tunefis функция, вы можете:
Настройка параметров функции членства для входных и выходных переменных.
Изучите нечеткие правила.
Настройте предшествующие и последующие параметры нечетких правил.
Дополнительные сведения о настройке FIS см. в разделе Настройка нечетких систем вывода.
Для FIS типа 1 и типа 2 можно задать настраиваемые параметры для входных и выходных MF и настроить значения выбранных параметров. Можно настроить параметры для любой комбинации входных и выходных MF. В этом примере показан пример рабочего процесса с использованием FIS типа 1. Для примера, который настраивает тип 2 FIS, посмотрите, Предсказывают Хаотический Временной ряд Используя Тип 2 FIS.
Создайте FIS.
fis = mamfis; fis = addInput(fis,[0 10],'NumMFs',3); fis = addOutput(fis,[0 1],'NumMFs',3); fis = addRule(fis,[1 1 1 1;1 1 1 1;1 1 1 1]);
Извлеките параметры ввода и вывода из FIS.
[in,out] = getTunableSettings(fis)
in =
VariableSettings with properties:
Type: "input"
VariableName: "input1"
MembershipFunctions: [1×3 fuzzy.tuning.MembershipFunctionSettings]
FISName: "fis"
out =
VariableSettings with properties:
Type: "output"
VariableName: "output1"
MembershipFunctions: [1×3 fuzzy.tuning.MembershipFunctionSettings]
FISName: "fis"
Настройки параметров представлены VariableSettings объекты, которые включают имя FIS, тип переменной, имя переменной и параметры MF. Проверьте установки параметров МФ 1 входа 1.
in(1).MembershipFunctions(1).Parameters
ans =
NumericParameters with properties:
Minimum: [-Inf -Inf -Inf]
Maximum: [Inf Inf Inf]
Free: [1 1 1]
Для каждого значения параметра входного или выходного MF можно указать его доступность для настройки и его минимальное и максимальное значения. По умолчанию все параметры MF свободны для настройки, и их диапазоны установлены в [-Inf, Inf].
Можно указать настраиваемость всех параметров в MF с помощью setTunable функция. Например, сделать MF 1 входа 1 неперестраиваемым.
in(1).MembershipFunctions(1) = setTunable(in(1).MembershipFunctions(1),false);
Можно также указать возможность настройки отдельных параметров MF. Сделать первый параметр MF 2 входа 1 неперестраиваемым.
in(1).MembershipFunctions(2).Parameters.Free(1) = false;
Для каждого параметра можно указать диапазон возможных значений. Например, установите минимальные значения для второго и третьего параметров MF 3 входа 1 в 0.
in(1).MembershipFunctions(3).Parameters.Minimum(2:3) = 0;
Аналогично установите максимальные значения для второго и третьего параметров MF 3 входа 1 в 15.
in(1).MembershipFunctions(3).Parameters.Maximum(2:3) = 15;
Процесс настройки устанавливает значения минимального и максимального диапазона настраиваемых параметров MF по умолчанию для соответствующих входных или выходных диапазонов.
Наконец, сделать параметры MF всех выходных функций членства неперестраиваемыми.
out = setTunable(out,false);
Укажите входные и выходные учебные данные. Для этого примера создайте учебные данные с помощью следующей функции.
ex/5 |
x = (0:0.1:10)'; y = abs(sin(2*x)./exp(x/5));
Укажите параметры для tunefis. Для этого примера используйте метод настройки генетического алгоритма. Используйте максимум пять поколений для оптимизации.
options = tunefisOptions("Method","ga"); options.MethodOptions.MaxGenerations = 5;
При наличии программного обеспечения Parallel Computing Toolbox™ можно повысить скорость процесса настройки, задав options.UseParallel кому true. Если у вас нет программного обеспечения Parallel Computing Toolbox, установите options.UseParallel кому false, которое является значением по умолчанию.
По умолчанию tunefis использует среднеквадратичную ошибку (RMSE) для вычисления затрат. Можно изменить функцию затрат на norm1 или norm2 путем установки options.DistanceMetric.
options.DistanceMetric = "norm1";Мелодия fis с использованием параметров, обучающих данных и параметров настройки.
rng('default') % for reproducibility [fisout,optimout] = tunefis(fis,[in;out],x,y,options);
Best Mean Stall
Generation Func-count f(x) f(x) Generations
1 100 32.84 32.84 0
2 147 32.84 32.84 1
3 194 32.84 32.84 2
4 241 32.84 32.84 3
5 288 32.84 32.84 4
Optimization terminated: maximum number of generations exceeded.
fisout включает обновленные значения параметров. optimout обеспечивает дополнительные выходы метода оптимизации и любые сообщения об ошибках, которые возвращаются в процессе обновления входной нечеткой системы с использованием значений оптимизированного параметра.
optimout
optimout = struct with fields:
tuningOutputs: [1×1 struct]
totalFcnCount: 288
totalRuntime: 2.7322
errorMessage: []
optimout.tuningOutputs
ans = struct with fields:
x: [5 9.1667 5.8333 10 14.1667]
fval: 32.8363
exitflag: 0
output: [1×1 struct]
population: [50×5 double]
scores: [50×1 double]
Можно дополнительно настроить fis с использованием только параметров ввода или вывода. В этом примере, поскольку для параметров вывода задано значение «Неперестраиваемый», настройка FIS только с параметрами ввода дает те же результаты.
rng('default')
[fisout,optimout] = tunefis(fis,in,x,y,options); Best Mean Stall
Generation Func-count f(x) f(x) Generations
1 100 32.84 32.84 0
2 147 32.84 32.84 1
3 194 32.84 32.84 2
4 241 32.84 32.84 3
5 288 32.84 32.84 4
Optimization terminated: maximum number of generations exceeded.
optimout
optimout = struct with fields:
tuningOutputs: [1×1 struct]
totalFcnCount: 288
totalRuntime: 2.4521
errorMessage: []
optimout.tuningOutputs
ans = struct with fields:
x: [5 9.1667 5.8333 10 14.1667]
fval: 32.8363
exitflag: 0
output: [1×1 struct]
population: [50×5 double]
scores: [50×1 double]
Помимо настройки параметров функции членства, в нечеткой системе можно настроить предшествующие и последующие параметры правил.
Получение параметров правил из нечеткой системы с помощью getTunableSettings.
[~,~,rule] = getTunableSettings(fis)
rule=3×1 object
3×1 RuleSettings array with properties:
Index
Antecedent
Consequent
FISName
Каждый параметр правила включает имя FIS, индекс правила в FIS и параметры настройки для правила, предшествующего и последующего (условия правила).
Для предложения правила можно задать следующие параметры.
AllowNot - Разрешить использование логики NOT, то есть отрицательных индексов MF. По умолчанию правила не допускают логику NOT.
Free - Сделать индексы MF ввода/вывода доступными для настройки. По умолчанию параметры предложения доступны для настройки.
AllowEmpty - допускать отсутствие входных/выходных переменных, то есть нулевых индексов MF. По умолчанию допускается отсутствие переменной.
rule(1).Antecedent(1)
ans =
ClauseParameters with properties:
AllowNot: 0
AllowEmpty: 1
Free: 1
Разрешить логику NOT в начале правила 1.
rule(1).Antecedent.AllowNot = true;
Сделать последствие правила 1 недоступным для настройки.
rule(1).Consequent.Free = 0;
Не допускайте отсутствия переменной в соответствии с правилом 2.
rule(2).Consequent.AllowEmpty = false;
Установите правило 3 как не настраиваемое.
rule(3) = setTunable(rule(3),false);
Набор options.DistanceMetric кому norm2.
options.DistanceMetric = "norm2";Мелодия fis с использованием параметров правила.
rng('default') % for reproducibility fisout = tunefis(fis,rule,x,y,options);
Best Mean Stall
Generation Func-count f(x) f(x) Generations
1 100 1.648 2.575 0
2 147 1.648 2.448 1
3 194 1.648 2.212 2
4 241 1.648 2.052 3
5 288 1.648 1.874 4
Optimization terminated: maximum number of generations exceeded.
Так как вы указали правило 3 как не настраиваемое, вы можете исключить правило 3 при настройке fis. При этом получается тот же результат настройки.
rng('default') % for reproducibility fisout = tunefis(fis,rule(1:2),x,y,options);
Best Mean Stall
Generation Func-count f(x) f(x) Generations
1 100 1.648 2.575 0
2 147 1.648 2.448 1
3 194 1.648 2.212 2
4 241 1.648 2.052 3
5 288 1.648 1.874 4
Optimization terminated: maximum number of generations exceeded.
Можно настроить tunefis для изучения правил нечеткой системы. Для этого установите OptimizationType вариант tunefisOptions комуlearning".
fisin = fis;
fisin.Rules = [];
options.OptimizationType = "learning";Установить максимальное количество правил в настроенном FIS на 3.
options.NumMaxRules = 3;
Размер настраиваемой базы правил может быть меньше NumMaxRules, потому что tunefis удаляет повторяющиеся правила из настроенного FIS. Если не указать NumMaxRules, то tunefis добавляет максимальное количество правил, определяемое возможными комбинациями входных MF. Входные комбинации MF по умолчанию включают нулевые индексы MF, допускающие отсутствие переменных. Комбинации по умолчанию исключают отрицательные индексы MF, так что логика NOT не допускается.
Набор options.DistanceMetric кому "rmse" и настроить FIS.
options.DistanceMetric = "rmse"; rng('default') % for reproducibility fisout = tunefis(fisin,[],x,y,options);
Best Mean Stall
Generation Func-count f(x) f(x) Generations
1 400 0.165 0.2956 0
2 590 0.165 0.2805 1
3 780 0.165 0.2578 2
4 970 0.165 0.2393 3
5 1160 0.165 0.2322 4
Optimization terminated: maximum number of generations exceeded.
В процессе настройки FIS автоматически изучает правила после оптимизации затрат с данными обучения. Проверьте настроенные правила.
fisout.Rules
ans =
1×3 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
________________________________
1 "input1==mf3 => output1=mf1 (1)"
2 "input1==mf1 => output1=mf2 (1)"
3 "input1==mf2 => output1=mf1 (1)"
Можно удалить некоторые из существующих правил и изучить дополнительные правила.
fisout.Rules(2:end) = []; rng('default') % for reproducibility fisout = tunefis(fisin,[],x,y,options);
Best Mean Stall
Generation Func-count f(x) f(x) Generations
1 400 0.165 0.2956 0
2 590 0.165 0.2805 1
3 780 0.165 0.2578 2
4 970 0.165 0.2393 3
5 1160 0.165 0.2322 4
Optimization terminated: maximum number of generations exceeded.
fisout.Rules
ans =
1×3 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
________________________________
1 "input1==mf3 => output1=mf1 (1)"
2 "input1==mf1 => output1=mf2 (1)"
3 "input1==mf2 => output1=mf1 (1)"
Можно также настроить предшествующие и последующие элементы существующих правил и изучить новые правила. Для этого получите настраиваемые параметры правила и передайте их в tunefis функция.
fisout.Rules(2:end) = [];
fisout.Rules(1).Antecedent = 1;
fisout.Rules(1).Consequent = 1;
[~,~,rule] = getTunableSettings(fisout);
rng('default')
fisout = tunefis(fisin,rule,x,y,options); Best Mean Stall
Generation Func-count f(x) f(x) Generations
1 400 0.165 0.3063 0
2 590 0.165 0.2845 1
3 780 0.165 0.2549 2
4 970 0.165 0.2344 3
5 1160 0.165 0.2153 4
Optimization terminated: maximum number of generations exceeded.
fisout.Rules
ans =
1×3 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
________________________________
1 "input1==mf1 => output1=mf2 (1)"
2 "input1==mf2 => output1=mf1 (1)"
3 "input1==mf3 => output1=mf1 (1)"
Можно настроить все параметры MF и правила одновременно. Сначала получите все настройки параметров для FIS.
[in,out,rule] = getTunableSettings(fis);
Настройте параметры настройки.
options = tunefisOptions('Method','ga'); options.MethodOptions.MaxGenerations = 5;
Настройте параметры MF и правила FIS.
rng('default') % for reproducibility fisout = tunefis(fis,[in;out;rule],x,y,options);
Best Mean Stall
Generation Func-count f(x) f(x) Generations
1 400 0.165 0.296 0
2 590 0.1638 0.2821 0
3 780 0.1625 0.2697 0
4 970 0.1625 0.2616 1
5 1160 0.1604 0.2512 0
Optimization terminated: maximum number of generations exceeded.
Для большой нечеткой системы, если настроить все параметры FIS в одном процессе настройки, получение ожидаемых результатов может занять несколько итераций. Чтобы увеличить время настройки, можно настроить параметры с помощью следующих двух шагов.
Настройка или изучение только параметров правил.
Настройте параметры MF и правила.
Обучение и настройка правил менее затратны в вычислительном отношении, чем использование параметров MF из-за небольшого количества параметров правил. Поэтому первый шаг быстро сходится к нечеткой базе правил во время обучения. На втором этапе использование базы правил с первого шага в качестве начального условия улучшает сходимость процесса настройки параметров.
При ручном создании FIS для настройки необходимо либо вручную создать начальную базу правил, либо изучить начальные правила. Кроме того, можно создать FIS с помощью genfis , которая создает исходную базу правил на основе данных обучения. Затем можно оптимизировать FIS с помощью tunefis. В этом подходе процесс настройки может использовать метод локальной оптимизации, поскольку база правил получена из обучающих данных.
В этом примере используются те же учебные данные, что и в предыдущих примерах.
Создать параметры для genfis которые задают пять MF, гауссово MF для входа и константу MF для выхода.
goptions = genfisOptions('GridPartition','NumMembershipFunctions',5, ... 'InputMembershipFunctionType','gaussmf', ... 'OutputMembershipFunctionType','constant');
Создайте начальный FIS и получите его параметры настройки.
fisin = genfis(x,y,goptions); [in,out,rule] = getTunableSettings(fisin);
Используйте метод поиска массива для оптимизации, установив максимальное количество итераций равным 25, и настройте FIS.
toptions = tunefisOptions('Method','patternsearch'); toptions.MethodOptions.MaxIterations = 25; rng('default') fisout = tunefis(fisin,[in;out],x,y,toptions);
Iter Func-count f(x) MeshSize Method
0 1 0.346649 1
1 19 0.346649 0.5 Refine Mesh
2 37 0.273812 1 Successful Poll
3 38 0.236413 2 Successful Poll
4 39 0.190794 4 Successful Poll
5 40 0.182142 8 Successful Poll
6 47 0.182142 4 Refine Mesh
7 49 0.162927 8 Successful Poll
8 56 0.162927 4 Refine Mesh
9 67 0.162927 2 Refine Mesh
10 69 0.159539 4 Successful Poll
11 80 0.159539 2 Refine Mesh
12 92 0.159539 1 Refine Mesh
13 94 0.159421 2 Successful Poll
14 106 0.159373 4 Successful Poll
15 117 0.159373 2 Refine Mesh
16 125 0.159185 4 Successful Poll
17 136 0.159185 2 Refine Mesh
18 151 0.159185 1 Refine Mesh
19 152 0.15914 2 Successful Poll
20 167 0.15914 1 Refine Mesh
21 170 0.158914 2 Successful Poll
22 185 0.158914 1 Refine Mesh
23 187 0.158839 2 Successful Poll
24 202 0.158839 1 Refine Mesh
25 206 0.158366 2 Successful Poll
26 215 0.158121 4 Successful Poll
Maximum number of iterations exceeded: increase options.MaxIterations.
Можно увеличить число итераций для дальнейшей оптимизации затрат.
genfis | getTunableSettings | tunefis