В этом примере показано, как настроить FIS настраивающийся процесс путем определения или пользовательской функции стоимости или пользовательского метода оптимизации.
Для получения дополнительной информации о настройке FIS смотрите Мелодию Нечеткие Правила и Параметры Функции принадлежности и Мелодия Нечеткие Деревья.
Можно задать пользовательскую функцию стоимости для настройки нечеткой системы. Выполнение так полезно для:
Обучение FIS использование пользовательской модели, не используя обучающие данные ввода/вывода. Для примера смотрите Мелодию Нечеткая Система Предотвращения Препятствия Робота Используя Пользовательскую Функцию стоимости.
Объединение выходных параметров ФИССА компонента дерева FIS с помощью математических операций, как показано в этом примере.
Как пример, считайте дерево FIS от Мелодии Нечеткими Деревьями.

Предположим, что вы хотите изменить дерево 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.
Можно добавить больше MFS ввода/вывода и задать дополнительные древовидные выходные параметры FIS, чтобы улучшать настраивающуюся производительность. Используя дополнительные параметры MF и больше обучающих данных для дополнительных древовидных выходных параметров FIS может далее подстроить выходные параметры fis1, fis2, и fis3.
Можно также реализовать собственный метод оптимизации параметров управления FIS с помощью getTunableSettings, getTunableValues, и setTunableValues. Этот пример использует эти функции, чтобы настроить основу правила нечеткой системы.
Создайте FIS, чтобы аппроксимировать , где варьируется от 0 до .
fisin = mamfis;
Добавьте вход с областью значений [0, ] и наличие пяти Гауссовых MFS. Кроме того, добавьте выход с областью значений [–1, 1] и наличие пяти Гауссовых MFS.
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);
Сделайте антецеденты правила ненастраиваемыми. В следствиях правила не позволяйте НЕ логику (отрицательные индексы 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)"
Позвольте НЕ логику в правилах и оптимизируйте 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)"
Используя НЕ логика создает больше комбинаций параметров правила, приводящих к большему количеству итераций, чтобы настроить 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