В этом примере показано, как настроить процесс настройки FIS, указав либо пользовательскую функцию затрат, либо пользовательский метод оптимизации.
Дополнительные сведения о настройке FIS см. в разделах Настройка нечетких правил и параметров функции членства и Настройка нечетких деревьев.
Можно указать пользовательскую функцию затрат для настройки нечеткой системы. Это полезно для:
Обучение FIS с использованием пользовательской модели без использования данных обучения вводу/выводу. Пример см. в разделе Настройка нечеткой системы предотвращения препятствий робота с использованием пользовательской функции затрат.
Объединение выходных данных компонентов FIS дерева FIS с использованием математических операций, как показано в этом примере.
В качестве примера рассмотрим дерево FIS из Tune Fuzzy Trees.

Предположим, что требуется изменить дерево FIS, как показано на следующей диаграмме, объединяя выходные данные FIS с использованием известных математических операций из обучающих данных.

Создайте дерево FIS, содержащее три объекта FIS. Выходы дерева FIS являются выходами отдельных объектов FIS.
fis1 = sugfis('Name','fis1'); fis1 = addInput(fis1,[0 10],'NumMFs',3,'MFType','gaussmf'); fis1 = addOutput(fis1,[-1 1],'NumMFs',3); fis2 = sugfis('Name','fis2'); fis2 = addInput(fis2,[0 10],'NumMFs',3,'MFType','gaussmf'); fis2 = addOutput(fis2,[-1 1],'NumMFs',3); fis3 = sugfis('Name','fis3'); fis3 = addInput(fis3,[0 10],'NumMFs',3,'MFType','gaussmf'); fis3 = addOutput(fis3,[0 1],'NumMFs',3); con = ["fis1/input1" "fis2/input1";"fis2/input1" "fis3/input1"]; fisT = fistree([fis1 fis2 fis3],con);
Создание данных обучения.
x = (0:0.1:10)'; y1 = sin(x)+cos(x); y2 = y1./exp(x); y = [y1;y2];
Для реализации операций сложения и умножения используйте функцию затрат. Для этого примера используйте пользовательскую функцию customcostfcn, в конце примера. Изучите базу правил с помощью этой функции затрат.
options = tunefisOptions('Method',"particleswarm",'OptimizationType',"learning"); options.MethodOptions.MaxIterations = 5; rng('default') fisTout1 = tunefis(fisT,[],@(fis)customcostfcn(fis,x,y),options);
Best Mean Stall
Iteration f-count f(x) f(x) Iterations
0 100 0.746 1.31 0
1 200 0.5089 1.249 0
2 300 0.5089 1.086 1
3 400 0.5089 1.112 2
4 500 0.5089 1.106 3
5 600 0.4999 1.051 0
Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.
Затем настройте все параметры дерева FIS.
options.Method = 'patternsearch'; options.MethodOptions.MaxIterations = 25; [in,out,rule] = getTunableSettings(fisTout1); rng('default') fisTout2 = tunefis(fisTout1,[in;out;rule],@(fis)customcostfcn(fis,x,y),options);
Iter Func-count f(x) MeshSize Method
0 1 0.499882 1
1 13 0.499864 2 Successful Poll
2 51 0.499727 4 Successful Poll
3 72 0.499727 2 Refine Mesh
4 117 0.499727 1 Refine Mesh
5 157 0.499542 2 Successful Poll
6 170 0.499485 4 Successful Poll
7 191 0.499485 2 Refine Mesh
8 217 0.499483 4 Successful Poll
9 238 0.499483 2 Refine Mesh
10 275 0.499483 4 Successful Poll
11 296 0.499483 2 Refine Mesh
12 340 0.499483 1 Refine Mesh
13 381 0.499483 2 Successful Poll
14 425 0.499483 1 Refine Mesh
15 497 0.499483 0.5 Refine Mesh
16 536 0.499394 1 Successful Poll
17 547 0.499217 2 Successful Poll
18 591 0.499217 1 Refine Mesh
19 603 0.499211 2 Successful Poll
20 630 0.498972 4 Successful Poll
21 652 0.498972 2 Refine Mesh
22 696 0.498972 1 Refine Mesh
23 768 0.498972 0.5 Refine Mesh
24 843 0.498972 0.25 Refine Mesh
25 859 0.495584 0.5 Successful Poll
26 869 0.494138 1 Successful Poll
Maximum number of iterations exceeded: increase options.MaxIterations.
Можно добавить дополнительные MF ввода/вывода и указать дополнительные выходы дерева FIS для повышения производительности настройки. Использование дополнительных параметров MF и дополнительных обучающих данных для дополнительных выходов дерева FIS может способствовать дальнейшей точной настройке выходов fis1, fis2, и fis3.
Можно также внедрить собственный метод оптимизации параметров FIS с помощью getTunableSettings, getTunableValues, и setTunableValues. В этом примере эти функции используются для настройки базы правил нечеткой системы.
Создайте FIS для аппроксимации ), где λ изменяется от 0 до 2δ.
fisin = mamfis;
Добавьте вход с диапазоном [0, ] и с пятью гауссовыми MF. Также добавьте выход с диапазоном [-1, 1] и с пятью гауссовыми MF.
fisin = addInput(fisin,[0 2*pi],'NumMFs',5,'MFType','gaussmf'); fisin = addOutput(fisin,[-1 1],'NumMFs',5,'MFType','gaussmf');
Добавьте пять правил.
fisin = addRule(fisin,[1 1 1 1;2 2 1 1;3 3 1 1;4 4 1 1;5 5 1 1]); fisin.Rules
ans =
1x5 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
________________________________
1 "input1==mf1 => output1=mf1 (1)"
2 "input1==mf2 => output1=mf2 (1)"
3 "input1==mf3 => output1=mf3 (1)"
4 "input1==mf4 => output1=mf4 (1)"
5 "input1==mf5 => output1=mf5 (1)"
Для более быстрого обновления FIS установите DisableStructuralChecks кому true.
fisin.DisableStructuralChecks = true;
Получение параметров правила.
[~,~,rule] = getTunableSettings(fisin);
Сделать правило antecedents неперестраиваемым. В последующих правилах не допускайте логику NOT (отрицательные индексы MF) или пустые переменные (нулевые индексы MF).
for i = 1:numel(rule) rule(i).Antecedent.Free = false; rule(i).Consequent.AllowNot = false; rule(i).Consequent.AllowEmpty = false; end
Создание данных для настройки.
x = (0:0.1:2*pi)'; y = sin(x);
Чтобы настроить параметры правила, используйте пользовательскую функцию customtunefis в конце этого примера. Установите число итераций равным 2 и не допускайте недопустимых значений параметров при обновлении FIS с помощью setTunableValues.
numite = 2; ignoreinvp = false; fisout = customtunefis(fisin,rule,x,y,numite,ignoreinvp);
Initial cost = 1.170519 Iteration 1: Cost = 0.241121 Iteration 2: Cost = 0.241121
Отображение настроенных правил.
fisout.Rules
ans =
1x5 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
________________________________
1 "input1==mf1 => output1=mf4 (1)"
2 "input1==mf2 => output1=mf5 (1)"
3 "input1==mf3 => output1=mf3 (1)"
4 "input1==mf4 => output1=mf1 (1)"
5 "input1==mf5 => output1=mf2 (1)"
Разрешить логику NOT в правилах и снова оптимизировать FIS.
for i = 1:numel(rule) rule(i).Consequent.AllowNot = true; end fisout = customtunefis(fisin,rule,x,y,numite,ignoreinvp);
Initial cost = 1.170519 Iteration 1: Cost = 0.357052 Iteration 2: Cost = 0.241121
fisout.Rules
ans =
1x5 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
________________________________
1 "input1==mf1 => output1=mf4 (1)"
2 "input1==mf2 => output1=mf5 (1)"
3 "input1==mf3 => output1=mf3 (1)"
4 "input1==mf4 => output1=mf1 (1)"
5 "input1==mf5 => output1=mf2 (1)"
Использование логики NOT создает больше комбинаций параметров правил, что приводит к большему количеству итераций для настройки FIS.
Далее, сброс AllowNot кому false и набор AllowEmpty кому true. Другими словами, допустим отсутствие переменных (нулевых выходных индексов MF) в последующих. Настройте FIS с обновленными параметрами правила.
for i = 1:numel(rule) rule(i).Consequent.AllowNot = false; rule(i).Consequent.AllowEmpty = true; end try fisout = customtunefis(fisin,rule,x,y,numite,ignoreinvp); catch me disp("Error: "+me.message) end
Initial cost = 1.170519
Error: Rule consequent must have at least one nonzero membership function index.
Процесс настройки завершается неуспешно, так как FIS содержит только один выход, который должен быть ненулевым (не пустым) в последующем правиле. Чтобы игнорировать недопустимые значения параметров, укажите IgnoreInvalidParameters с setTunableValues.
Набор ignoreinvp кому true, которая определяет IgnoreInvalidParameters значение в вызове setTunableValues используется в customtunefis.
ignoreinvp = true; fisout = customtunefis(fisin,rule,x,y,numite,ignoreinvp);
Initial cost = 1.170519 Iteration 1: Cost = 0.241121 Iteration 2: Cost = 0.241121
fisout.Rules
ans =
1x5 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
________________________________
1 "input1==mf1 => output1=mf4 (1)"
2 "input1==mf2 => output1=mf5 (1)"
3 "input1==mf3 => output1=mf3 (1)"
4 "input1==mf4 => output1=mf1 (1)"
5 "input1==mf5 => output1=mf2 (1)"
В этом случае процесс настройки обходит недопустимые значения и использует только допустимые значения параметров для оптимизации.
По умолчанию tunefis игнорирует недопустимые значения при обновлении нечетких системных параметров. Это поведение можно изменить, задав tunefisOptions.IgnoreInvalidParameters кому false.
function cost = customcostfcn(fis,x,y) tY = evalfis(fis,x); sincosx = tY(:,1)+tY(:,2); sincosexpx = sincosx.*tY(:,3); actY = [sincosx;sincosexpx]; d = y(:)-actY; cost = sqrt(mean(d.*d)); end
function fis = customtunefis(fis,rule,x,y,n,ignore) % Show the initial cost. cost = findcost(fis,x,y); fprintf('Initial cost = %f\n',cost); % Optimize the rule parameters. numMFs = numel(fis.Outputs.MembershipFunctions); for ite = 1:n for i = 1:numel(rule) % Get the consequent value. pval = getTunableValues(fis,rule(i)); % Loop through the output MF indices to minimize the cost. % Use the output indices according to AllowNot and AllowEmpty. allowNot = rule(i).Consequent.AllowNot; allowEmpty = rule(i).Consequent.AllowEmpty; if allowNot && allowEmpty mfID = -numMFs:numMFs; elseif allowNot && ~allowEmpty mfID = [-numMFs:-1 1:numMFs]; elseif ~allowNot && allowEmpty mfID = 0:numMFs; else mfID = 1:numMFs; end cost = 1000; minCostFIS = fis; for j = 1:length(mfID) % Update the consequent value. pval(1) = mfID(j); % Set the consequent value in the FIS. fis = setTunableValues(fis,rule(i),pval,'IgnoreInvalidParameters',ignore); % Evaluate cost. rmse = findcost(fis,x,y); % Update the FIS with the minimum cost. if rmse<cost cost = rmse; minCostFIS = fis; end end fis = minCostFIS; end fprintf('Iteration %d: Cost = %f\n',ite,cost); end end
function cost = findcost(fis,x,y) actY = evalfis(fis,x); d = y - actY; cost = sqrt(mean(d.*d)); end