主要内容

自定义FIS调优流程

此示例显示如何通过指定自定义成本函数或自定义优化方法自定义FIS优化过程。

有关调整FIS的更多信息,请参阅调整模糊规则和隶属函数参数优化模糊树

使用自定义成本函数调整FIS

您可以指定自定义成本函数来调整模糊系统。这样做有助于:

作为一个例子,考虑FIS树从优化模糊树

假设您想要如下图所示修改FIS树,使用来自训练数据的已知数学操作组合FIS输出。

创建包含三个FIS对象的FIS树。FIS树的输出是单个FIS对象的输出。

fis1=sugfis(“名字”“fis1”); fis1=附加输入(fis1,[0 10],“NumMFs”3.“MFType”“高斯函数”);[-1 1], [-1 1],“NumMFs”,3); fis2=sugfis(“名字”“fis2”); fis2=附加输入(fis2,[0 10],“NumMFs”3.“MFType”“高斯函数”);[-1 1], [-1 1],“NumMFs”3);fis3 = sugfis (“名字”“fis3”);[0 10], [0 10],“NumMFs”3.“MFType”“高斯函数”); fis3=添加输出(fis3,[0 1],“NumMFs”,3);con=[“fis1 / input1”“fis2 / input1”“fis2 / input1”“fis3 / input1”]; fisT=FISTREY([fis1 fis2 fis3],con);

生成培训数据。

x =(0:0.1:10)”;日元= sin (x) + cos (x);y2 = y1. / exp (x);y = (y1, y2);

要实现加法和乘法运算,请使用代价函数。对于本例,请使用自定义函数customcostfcn,包含在示例的最后。使用此成本函数学习规则库。

选择= tunefisOptions (“方法”“particleswarm”“OptimizationType”“学习”); options.MethodOptions.MaxIterations=5;rng(“默认”)FISTUT1=tunefis(fisT,[],@(fis)自定义成本FCN(fis,x,y),选项);
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 24 500 0.5089 1.106 3 5 600 0.4999 1.051 0优化结束:迭代次数超过OPTIONS.MaxIterations。

接下来,调整FIS树的所有参数。

选项.方法=“模式搜索”;options.MethodOptions.MaxIterations=25;[in、out、rule]=getTunableSettings(Fistut1);rng(“默认”) fiout2 = tunefis(fiout1,[in;out;rule],@(fis)customcostfcn(fis,x,y),options);
Iter Func-count f (x) MeshSize方法0.499882 0 1 1 1 13 0.499864 - 2成功51 0.499727 - 4成功的调查调查2 3 72 0.499727 117 0.499727 - 1细化网格细化网格4 170 0.499485 157 0.499542 - 2成功的调查6 4成功调查7 191 0.499485 - 2细化网格238 0.499483 217 0.499483 - 4成功调查9 2细化网格10 275 0.499483 - 4成功的调查11 296 0.499483 340 0.499483 - 1细化网格细化网格12 13 425 381 0.499483 - 2成功的调查14 15 497 0.499483 0.5 0.499483 - 1细化网格细化网格成功调查17 16 536 0.499394 547 0.499217 - 2成功的调查18 591 0.499217 - 1细化网格19 603 0.499211 - 2成功的调查调查21 652 630 0.498972 - 4成功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最大迭代次数超过:增加选项。

您可以添加更多输入/输出MFs,并指定其他FIS树输出,以提高调整性能。使用其他MF参数和更多FIS树输出的训练数据,可以进一步微调的输出fis1fis2fis3

使用自定义优化方法调整FIS

您也可以实现自己的FIS参数优化方法使用getTunableSettingsgetTunableValues可设置值. 本例使用这些函数来调整模糊系统的规则库。

创建一个FIS来近似 θ 哪里 θ 从0到 2 π

fisin=mamfis;

添加范围为[0]的输入, 2 π ]和5个高斯mf。另外,添加一个范围为[- 1,1]的输出,并具有5个高斯mf。

[0 2*pi],“NumMFs”5,“MFType”“高斯函数”);fisin=addOutput(fisin,[-1],“NumMFs”5,“MFType”“高斯函数”);

添加五条规则。

addRule(fin,[1 1 1;2 2 1;3 3 1 1;4 4 1 1;5 5 1 1]);fisin。规则
“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,请设置禁用结构检查真正的

fisin.DisableStructuralChecks=true;

获取规则参数设置。

[~,~,规则]=getTunableSettings(fisin);

将规则先行项设置为非无法。在规则结果中,不允许使用not逻辑(负MF索引)或空变量(零MF索引)。

i = 1:numel(rule) rule(i).先行词。自由= false;(我).Consequent规则。AllowNot = false;(我).Consequent规则。AllowEmpty = false;终止

为调优生成数据。

x =(0:0.1:2 *π)';y = sin (x);

要优化规则参数,请使用自定义函数海关通缉犯包括在本例末尾。将迭代次数设置为2,并且在使用更新FIS时不允许使用无效的参数值可设置值

numite = 2;ignoreinvp = false;fisout = customtunefis (fisin,规则,x, y, numite, ignoreinvp);
初始成本=1.170519迭代1:成本=0.241121迭代2:成本=0.241121

显示调整后的规则。

fisout。规则
信息描述________________________________ 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。

i=1:numel(规则)规则(i).continued.AllowNot=true;终止fisout = customtunefis (fisin,规则,x, y, numite, ignoreinvp);
初始成本=1.170519迭代1:成本=0.357052迭代2:成本=0.241121
fisout。规则
信息描述________________________________ 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。

接下来,重置阿洛诺错误的并设置AllowEmpty真正的.换句话说,允许结果中不存在变量(输出MF索引为零)。使用更新的规则参数设置调优FIS。

i = 1:numel(rule) rule(i)。AllowNot = false;(我).Consequent规则。AllowEmpty = true;终止试一试fisout = customtunefis (fisin,规则,x, y, numite, ignoreinvp);接住我disp (“错误:”+ me.message)终止
初始成本=1.170519
错误:规则结果必须至少有一个非零成员函数索引。

调优过程失败了,因为FIS只包含一个输出,这个输出在规则结果中必须是非零(非空)。若要忽略无效的参数值,请指定忽略无效参数具有可设置值

ignoreinvp真正的,它指定忽略无效参数的值可设置值用于海关通缉犯

ignoreinvp=true;fisout=customtunefis(fisin、规则、x、y、numite、ignoreinvp);
初始成本=1.170519迭代1:成本=0.241121迭代2:成本=0.241121
fisout。规则
信息描述________________________________ 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错误的

自定义函数

作用cost = customcostfcn(fis,x,y)sincosx =泰(:1)+泰(:,2);sincosexpx = sincosx。*泰(:,3);actY = [sincosx; sincosexpx];d = y (:) -actY;成本=√意味着(d。* d));终止
作用fis = customtunefis (fis,规则,x, y, n,忽略)%显示初始成本。成本= findcost (fis, x, y);流('初始成本=%f\n'、成本);%优化规则参数。numMFs =元素个数(fis.Outputs.MembershipFunctions);ite=1:ni = 1:元素个数(规则)%得到结果值。pval=getTunableValues(fis,规则(i));%循环输出MF指数,以最小化成本。%根据AllowNot和AllowEmpty使用输出指数。.Consequent.AllowNot allowNot =规则(我);.Consequent.AllowEmpty allowEmpty =规则(我);如果allowNot && allowEmpty mfID = - nummf: nummf;elseifallowNot&&allowEmpty mfID=[-numMFs:-11:numMFs];elseif~allowNot&&allowEmpty mfID=0:numMFs;其他的mfID=1:numMFs;终止成本= 1000;minCostFIS = fis;j=1:长度(mfID)%更新后置值。pval (1) = mfID (j);%在FIS中设置后置值。fis = setTunableValues (pval fis、规则(i),“IgnoreInvalidParameters”,忽略);%评估成本。rmse=findcost(fis,x,y);%以最小的成本更新FIS。如果rmse<成本=rmse;最小成本=fis;终止终止fis = minCostFIS;终止流('迭代%d:成本=%f\n',成本);终止终止
作用成本=findcost(fis,x,y)actY=evalfis(fis,x);d=y-actY;成本=sqrt(平均值(d.*d));终止

另请参阅

|

相关的话题