主要内容

调整燃油里程预测的FIS树

这个例子展示了如何调优FIS树的参数,这是一个连接模糊推理系统的集合。本例使用粒子群和模式搜索优化,这需要全局优化工具箱™软件。

汽车油耗的英里/加仑(MPG)预测是一个典型的非线性回归问题。它使用几个汽车剖面属性来预测油耗。训练数据可在加州大学欧文分校获得机器学习知识库并包含从不同品牌和型号的汽车收集的数据。

本例使用以下六个输入数据属性用FIS树预测输出数据属性MPG:

  1. 气缸数量

  2. 位移

  3. 马力

  4. 重量

  5. 加速度

  6. 模型一年

准备数据

加载数据。从存储库获得的数据集的每一行表示不同的汽车配置文件。

data = loadGasData;

数据包含7列,其中前6列包含以下输入属性。

  • 气缸数量

  • 位移

  • 马力

  • 重量

  • 加速度

  • 模型一年

第七列包含输出属性MPG。

创建独立的输入和输出数据集,X而且Y,分别。

X = data(:,1:6);Y = data(:,7);

将输入和输出数据集划分为训练数据(奇数索引样本)和验证数据(偶数索引样本)。

trnX = X(1:2:end,:);%训练输入数据集trnY = Y(1:2:end,:);%训练输出数据集vldX = X(2:2:end,:);%验证输入数据集vdy = Y(2:2:end,:);%验证输出数据集

提取每个数据属性的范围,您将在FIS构建期间将其用于输入/输出范围定义。

dataRange = [min(data)' max(data)'];

构造一个FIS树

对于这个例子,使用以下步骤构造一个FIS树:

  1. 根据输入属性与输出属性的相关性对输入属性进行排序。

  2. 使用排序的输入属性创建多个FIS对象。

  3. 从FIS对象构造一个FIS树。

根据相关系数对输入进行排序

计算训练数据的相关系数。在相关矩阵的最后一行中,前六个元素显示了六个put数据属性与输出属性之间的相关系数。

C1 = corrcoef(数据);c1(最终,:)
ans =1×7-0.7776 -0.8051 -0.7784 -0.8322 0.4233 0.5805 1.0000

前四个输入属性为负值,后两个输入属性为正值。

将具有负相关关系的输入属性按相关系数绝对值降序排列。

  1. 重量

  2. 位移

  3. 马力

  4. 气缸数量

将具有正相关关系的输入属性按相关系数绝对值降序排列。

  1. 模型一年

  2. 加速度

这些排名表明,体重和车型年份分别与MPG有最高的负相关和正相关。

创建模糊推理系统

对于本例,使用以下结构实现FIS树。

FIS树使用多个双输入一输出FIS对象来减少推理过程中使用的规则总数。fis1fis2,fis3直接获取输入值并生成中间值英里/加仑值,这些值被进一步组合使用fis4而且fis5

将具有负相关值和正相关值的输入属性配对,结合对输出的正相关和负相关影响进行预测。输入按其级别分组如下:

  • 重量和型号年份

  • 位移和加速度

  • 马力和气缸数

最后一组只包括负相关值的输入,因为只有两个输入具有正相关值。

与Mamdani系统相比,本示例使用sugeno类型的FIS对象在调优过程中进行更快的计算。每个FIS包括两个输入和一个输出,其中每个输入包含两个默认三角隶属函数(mf),输出包括4个默认常量mf。使用相应的数据属性范围指定输入和输出范围。

第一个FIS结合了权重和模型年份属性。

Fis1 = sugfis(“名字”“fis1”);fis1 = addInput(fis1,dataRange(4,:)),“NumMFs”2,“名字”“重量”);fis1 = addInput(fis1,dataRange(6,:)),“NumMFs”2,“名字”“年”);fis1 = addOutput(fis1,dataRange(7,:)),“NumMFs”4);

第二个FIS结合了位移和加速度属性。

Fis2 = sugfis(“名字”“fis2”);fis2 = addInput(fis2,dataRange(2,:)),“NumMFs”2,“名字”“位移”);fis2 = addInput(fis2,dataRange(5,:)),“NumMFs”2,“名字”“加速”);fis2 = addOutput(fis2,dataRange(7,:)),“NumMFs”4);

第三个FIS结合了马力和气缸数量属性。

Fis3 = sugfis(“名字”“fis3”);fis3 = addInput(fis3,dataRange(3,:)),“NumMFs”2,“名字”“马力”);fis3 = addInput(fis3,dataRange(1,:)),“NumMFs”2,“名字”“气缸”);fis3 = addOutput(fis3,dataRange(7,:)),“NumMFs”4);

第四个FIS结合了第一个和第二个FIS的输出。

Fis4 = sugfis(“名字”“fis4”);fis4 = addInput(fis4,dataRange(7,:)),“NumMFs”2);fis4 = addInput(fis4,dataRange(7,:)),“NumMFs”2);fis4 = addOutput(fis4,dataRange(7,:)),“NumMFs”4);

最终FIS结合第三和第四FIS的输出,并生成估计的MPG。该FIS具有与第四个FIS相同的输入和输出范围。

Fis5 = fis4;fis5。Name =“fis5”;fis5.Outputs(1)。Name =“英里”

构造FIS树

连接模糊系统(fis1fis2fis3fis4,fis5)根据FIS树形图。

fisTin = fistree([fis1 fis2 fis3 fis4 fis5],[...“fis1 / output1”“fis4 / input1”...“fis2 / output1”“fis4 / input2”...“fis3 / output1”“fis5 / input2”...“fis4 / output1”“fis5 / input1”])
fisTin = fisree with properties: Name: "fistreemodel" FIS: [1x5 sugfis]连接:[4x2 string]输入:[6x1 string]输出:"fis5/mpg" DisableStructuralChecks: 0参考' gettuntesettings '方法进行参数优化。

用训练数据调优FIS树

调优分两个步骤执行。

  1. 学习规则库,同时保持输入和输出MF参数不变。

  2. 优化输入/输出mf和规则的参数。

第一步由于规则参数较少,计算量较小,并且在训练过程中快速收敛到模糊规则库。在第二步中,使用第一步中的规则库作为初始条件,可以快速收敛参数调优过程。

学习规则

方法指定调优选项,以了解规则库tunefisOptions对象。全局优化方法(遗传算法或粒子群)适用于模糊系统所有参数都未调谐时的初始训练。对于本例,使用粒子群优化方法(“particleswarm”).

要学习新规则,设置OptimizationType“学习”.将最大规则数限制为4条。每个FIS的调优规则数量可以小于这个限制,因为调优过程会删除重复的规则。

选项= tunefisOptions(“方法”“particleswarm”...“OptimizationType”“学习”...“NumMaxRules”4);

如果您拥有并行计算工具箱™软件,则可以通过设置选项。UseParallel真正的.如果没有并行计算工具箱软件,请设置选项。UseParallel

将最大迭代次数设置为50。为了减少规则学习过程中的训练误差,可以增加迭代次数。然而,使用过多的迭代会导致FIS树对训练数据的过度调整,从而增加验证错误。

options.MethodOptions.MaxIterations = 50;

由于粒子群优化使用随机搜索,为了获得可重复的结果,请将随机数生成器初始化为默认配置。

rng (“默认”

使用指定的调优数据和选项调优FIS树。根据FIS树的连接,设置训练数据的输入顺序如下:重量一年位移加速度马力,气缸

inputOrders1 = [4 6 2 5 3 1];orderedTrnX1 = trnX(:,inputOrders1);

学习规则tunefis这个过程大约需要4分钟。对于本例,通过设置启用调优runtunefis真正的.在不运行的情况下加载预训练的结果tunefis,您可以设置runtunefis

Runtunefis = false;

学习新规则时,参数设置可以为空。有关更多信息,请参见tunefis

如果runtunefis fisTout1 = tunefis(fisTin,[],orderedTrnX1,trnY,options);% #好< UNRCH >其他的Tunedfis = load(“tunedfistreempgprediction.mat”);fiout1 = tunedfis. fiout1;rmseValue = calculateRMSE(fisTout1,orderedTrnX1,trnY);流('训练RMSE = %。3 f MPG \ n”, rmseValue);结束
训练RMSE = 3.399 MPG

最好的f (x)列显示训练均方根误差(RMSE)。

学习过程为FIS树生成一组新规则。

流(“规则总数= %d\n”元素个数([fisTout1.FIS.Rules]));
规则总数= 17

对于训练数据集和验证数据集,所学习的系统应具有相似的RMSE性能。要计算验证数据集的RMSE,请求值fisout1使用验证输入数据集vldX.若要在计算期间隐藏运行时警告,请将所有警告选项设置为没有一个

计算生成的输出数据和验证输出数据集之间的RMSEvldY.由于训练误差和验证误差相似,学习后的系统不会对训练数据进行过拟合。

orderedVldX1 = vldX(:,inputOrders1);plotActualAndExpectedResultsWithRMSE (fisTout1 orderedVldX1 vldY)

图中包含2个轴对象。标题为RMSE = 3.4626 MPG的Axes对象1包含3个类型为bar的对象。这些对象表示实际MPG,期望MPG,实际和期望值的最小值。标题为“实际值与期望值之间的差异”的Axes对象2包含一个类型为bar的对象。

调优所有参数

在学习新规则之后,调优输入/输出MF参数以及已学习规则的参数。要获得FIS树的可调参数,请使用getTunableSettings函数。

[in,out,rule] = gettunthesettings (fisTout1);

若要在不学习新规则的情况下优化现有FIS树参数设置,请设置OptimizationType“优化”

选项。OptimizationType =“优化”

由于FIS树已经使用训练数据学习了规则,因此使用局部优化方法快速收敛参数值。对于本例,使用模式搜索优化方法(“patternsearch”).

选项。方法=“patternsearch”

调优FIS树参数需要比前面的规则学习步骤更多的迭代。因此,将调优过程的最大迭代次数增加到75。与第一个调优阶段一样,您可以通过增加迭代次数来减少训练误差。然而,使用过多的迭代可能会对训练数据的参数进行调整,从而增加验证错误。

options.MethodOptions.MaxIterations = 75;

若要改进模式搜索结果,请设置方法选项UseCompletePoll为true。

options.MethodOptions.UseCompletePoll = true;

使用指定的可调参数、训练数据和调优选项调优FIS树参数。

使用tunefis函数需要几分钟。在不运行的情况下加载预训练的结果tunefis,您可以设置runtunefis

rng (“默认”如果runtunefis fiout2 = tunefis(fiout1,[in;out;rule],orderedTrnX1,trnY,options);% #好< UNRCH >其他的fisTout2 = tunedfis.fisTout2;rmseValue = calculateRMSE(fisTout2,orderedTrnX1,trnY);流('训练RMSE = %。3 f MPG \ n”, rmseValue);结束
训练RMSE = 3.037 MPG

在调优过程结束时,与前一步相比,训练误差减小了。

检查性能

验证调优后FIS树的性能,fisout2,使用验证输入数据集vldX

比较从验证输出数据集中获得的预期MPGvldY和实际MPG生成fisout2.计算这些结果之间的RMSE。

plotActualAndExpectedResultsWithRMSE (fisTout2 orderedVldX1 vldY)

图中包含2个轴对象。标题为RMSE = 3.3501 MPG的Axes对象1包含3个类型为bar的对象。这些对象表示实际MPG,期望MPG,实际和期望值的最小值。标题为“实际值与期望值之间的差异”的Axes对象2包含一个类型为bar的对象。

与初始学习规则库的结果相比,调优FIS树参数提高了RMSE。由于训练误差和验证误差相似,参数值没有超调。

分析中间数据

为了深入了解模糊树的操作,您可以将组件模糊系统的输出添加为FIS树的输出。对于本例,要访问中间FIS输出,请向调优的FIS树添加三个额外的输出。

拳头3 =拳头2;fisTout3.Outputs结束(+ 1)=“fis1 / output1”;fisTout3.Outputs结束(+ 1)=“fis2 / output1”;fisTout3.Outputs结束(+ 1)=“fis3 / output1”

为了生成额外的输出,计算增强的FIS树,fisTout3

actY = evaluateFIS(fisTout3,orderedVldX1);图(actY(:,[2 3 4 1])) xlabel(“输入数据集索引”) ylabel (“英里”),轴([1 200 0 55])fis1的输出fis2的输出fis3的输出fis5的输出),...“位置”“东北”“NumColumns”2)标题(“中期及最终产出”

图中包含一个轴对象。标题为Intermediate和Final Outputs的axes对象包含4个类型为line的对象。这些对象表示fis1的输出,fis2的输出,fis3的输出,fis5的输出。

FIS树的最终输出(fis5的输出)似乎与的输出高度相关fis1而且fis3.为了验证这一评估,检查FIS输出的相关系数。

c2 = corrcoef(actY(:,[2 3 4 1]));c2(最终,:)
ans =1×40.9541 0.8245 -0.8427 1.0000

相关矩阵的最后一行表示的输出fis1而且fis3(第一列和第三列)与最终输出的相关性高于的输出fis2(第二列)。这个结果表明可以通过删除来简化FIS树fis2而且fis4与原始树结构相比,可以产生类似的训练结果。

FIS树的简化和再训练

删除fis2而且fis4从FIS树中连接输出fis1的第一个输入fis5.从FIS树中删除FIS时,与该FIS的任何现有连接也将被删除。

fisTout3。Fis ([2 4]) = [];连接(end+1,:) = [“fis1 / output1”“fis5 / input1”];fis5.Inputs(1)。Name =“fis1out”

为了使FIS树输出的数量与训练数据中的输出数量相匹配,从fis1而且fis3

fisTout3.Outputs(2:end) = [];

根据新的FIS树输入配置更新输入训练数据顺序。

inputOrders2 = [4 6 3 1];orderedTrnX2 = trnX(:,inputOrders2);

由于FIS树配置已更改,因此必须重新运行学习和调优步骤。在学习阶段,还将调整现有规则参数以适应FIS树的新配置。

选项。方法=“particleswarm”;选项。OptimizationType =“学习”;options.MethodOptions.MaxIterations = 50;[~,~,rule] = gettunthesettings (fisTout3);rng (“默认”如果runtunefis fisTout4 = tunefis(fisTout3,rule,orderedTrnX2,trnY,options);% #好< UNRCH >其他的fiout4 = tunedfis. fiout4;rmseValue = calculateRMSE(fisTout4,orderedTrnX2,trnY);流('训练RMSE = %。3 f MPG \ n”, rmseValue);结束
训练RMSE = 3.380 MPG

在训练阶段,对隶属函数参数和规则参数进行调优。

选项。方法=“patternsearch”;选项。OptimizationType =“优化”;options.MethodOptions.MaxIterations = 75;options.MethodOptions.UseCompletePoll = true;[in,out,rule] = gettunthesettings (fisTout4);rng (“默认”如果runtunefis fiout5 = tunefis(fiout4,[in;out;rule],orderedTrnX2,trnY,options);% #好< UNRCH >其他的fiout5 = tunedfis. fiout5;rmseValue = calculateRMSE(fisTout5,orderedTrnX2,trnY);流('训练RMSE = %。3 f MPG \ n”, rmseValue);结束
训练RMSE = 3.049 MPG

在调优过程的末尾,FIS树包含更新的MF和规则参数值。新的FIS树配置的规则库大小小于以前的配置。

流(“规则总数= %d\n”元素个数([fisTout5.FIS.Rules]));
规则总数= 11

检查简化FIS树的性能

使用检查数据集的四个输入属性评估更新的FIS树。

orderedVldX2 = vldX(:,inputOrders2);plotActualAndExpectedResultsWithRMSE (fisTout5 orderedVldX2 vldY)

图中包含2个轴对象。标题为RMSE = 3.1524 MPG的Axes对象1包含3个类型为bar的对象。这些对象表示实际MPG,期望MPG,实际和期望值的最小值。标题为“实际值与期望值之间的差异”的Axes对象2包含一个类型为bar的对象。

与使用六个输入属性的第一个配置相比,具有四个输入属性的简化FIS树在RMSE方面产生了更好的结果。因此,这表明FIS树可以用更少的输入和规则来表示,从而泛化训练数据。

结论

您可以通过以下方法进一步提高调优后的FIS树的训练误差:

  • 增加规则学习和参数调优阶段的迭代次数。这样做会增加优化过程的持续时间,也会增加验证错误,因为使用训练数据调整了系统参数。

  • 使用全局优化方法,如遗传算法而且particleswarm,在规则学习和参数调优阶段。遗传算法而且particleswarm由于它们是全局优化器,因此对于大参数调优范围执行得更好。另一方面,patternsearch而且simulannealbnd对于较小的参数范围执行得更好,因为它们是局部优化器。如果已经使用训练数据将规则添加到FIS树中,则patternsearch而且simulannealbnd可能会产生更快的收敛与遗传算法而且particleswarm.有关这些优化方法及其选项的详细信息,请参见遗传算法(全局优化工具箱)particleswarm(全局优化工具箱)patternsearch(全局优化工具箱),simulannealbnd(全局优化工具箱)

  • 更改FIS属性,例如FIS的类型、输入的数量、输入/输出MF的数量、MF类型和规则的数量。对于具有大量输入的模糊系统,Sugeno FIS通常比Mamdani FIS收敛得更快,因为Sugeno系统具有更少的输出MF参数(如果常数使用mf)和更快的去模糊。少量的mf和规则减少了要调优的参数数量,从而产生了更快的调优过程。此外,大量的规则可能会过度拟合训练数据。

  • 修改mf和规则的可调参数设置。例如,您可以在不改变其峰值位置的情况下调整三角形MF的支持。金宝app这样做可以减少可调参数的数量,并可以为特定应用程序产生更快的调优过程。对于规则,可以通过设置AllowEmpty可调设置为,这减少了学习阶段的规则总数。

  • 改变FIS树的属性,如模糊系统的数量和模糊系统之间的连接。

  • 对FIS树的输入使用不同的排名和分组。

本地函数

函数plotActualAndExpectedResultsWithRMSE (fis, x, y)计算实际结果与预期结果之间的RMSE[rmse,actY] = calculateRMSE(fis,x,y);%绘图结果图子图(2,1,1)hold住bar(actY) bar(y) bar(min(actY,y),“FaceColor”,[0.5 0.5 0.5])持有轴([0 200 0 60])"验证输入数据集索引"), ylabel (“英里”)传说([“实际MPG”“预期MPG”“实际值和期望值的最小值”),...“位置”“西北”)标题(" rmse = "+ num2str(rmse) +“英里”) subplot(2,1,2) bar(actY-y) xlabel("验证输入数据集索引"), ylabel (“错误(MPG)”)标题(“实际值与期望值之差”结束函数[rmse,actY] = calculateRMSE(fis,x,y)评估FISactY = evaluateFIS(fis,x);计算RMSEdel = actY - y;Rmse =√(mean(del.^2));结束函数y = evaluateFIS(fis,x)指定FIS评估的选项持续的evalOptions如果isempty(evalOptions)“EmptyOutputFuzzySetMessage”“没有”...“NoRuleFiredMessage”“没有”“OutOfRangeInputValueMessage”“没有”);结束评估FISy = evalfis(fis,x,evalOptions);结束

另请参阅

|||

相关的话题