调整FIS树的汽油里程预测

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

以英里/加仑(MPG)为单位的汽车油耗预测是一个典型的非线性回归问题。它使用几个汽车剖面属性来预测燃油消耗。培训数据可在加州大学欧文分校(University of California at Irvine)获得机器学习库并且包含了从各种型号的汽车中收集的数据。

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

  1. 气缸数

  2. 位移

  3. 马力

  4. 重量

  5. 加速度

  6. 模型一年

准备数据

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

数据= loadgas;

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

  • 气缸数

  • 位移

  • 马力

  • 重量

  • 加速度

  • 模型一年

第七列包含输出属性MPG。

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

X =数据(:,1:6);(Y =数据:7);

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

trnX = X(1:2:最终,);训练输入数据集trnY = Y(1:2:最终,);训练输出数据集vldX = X(2:2:最终,);验证输入数据集vldY = Y(2:2:最终,);验证输出数据集

提取每个数据属性的范围,您将在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.805 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 = fisree ([fis1 fis2 fis3 fis4 fis5],[...“fis1 / output1”“fis4 / input1”...“fis2 / output1”“fis4 / input2”...“fis3 / output1”“fis5 / input2”...“fis4 / output1”“fis5 / input1”])
fisTin = firee with properties: FIS: [1x5 sugfis] Connections: [4x2 string] input: [6x1 string] Outputs: "fis5/mpg" DisableStructuralChecks: 0参数优化参见' gettablelesettings '方法。

用训练数据调优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 =负载(“tunedfistreempgprediction.mat”);fisTout1 = tunedfis.fisTout1;流(培训RMSE = %。3 f MPG \ n”calculateRMSE (fisTout1 orderedTrnX1 trnY));结束
训练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)

调整所有参数

学习新规则后,根据学习到的规则参数调优输入/输出MF参数。要获得FIS树的可调参数,请使用getTunableSettings函数。

[,,规则]= getTunableSettings (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 fisTout2 = tunefis(fisTout1,[in;out;rule],orderedTrnX1,trnY,options);% #好< UNRCH >其他的fisTout2 = tunedfis.fisTout2;流(培训RMSE = %。3 f MPG \ n”calculateRMSE (fisTout2 orderedTrnX1 trnY));结束
训练RMSE = 3.037 MPG

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

检查性能

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

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

plotActualAndExpectedResultsWithRMSE (fisTout2 orderedVldX1 vldY)

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

分析中间数据

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

fisTout3 = fisTout2;fisTout3.Outputs结束(+ 1)=“fis1 / output1”;fisTout3.Outputs结束(+ 1)=“fis2 / output1”;fisTout3.Outputs结束(+ 1)=“fis3 / output1”

为了生成额外的输出,评估增强的FIS树,fisTout3

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

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的输出fis1的第一个输入fis5.当从FIS树中删除FIS时,到该FIS的任何现有连接也将被删除。

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

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

fisTout3.Outputs(2:结束)= [];

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

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

由于更改了FIS树配置,您必须重新运行学习和调优步骤。在学习阶段,对现有规则参数也进行调优,以适应FIS树的新配置。

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

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

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

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

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

检查简化FIS树的性能

使用检查数据集的四个输入属性计算更新后的FIS树。

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

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

结论

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

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

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

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

  • 修改mf和规则的可调参数设置。例如,您可以调优三角形MF的支持,而不改变其峰值位置。万博1manbetx这样做可以减少可调参数的数量,并为特定的应用程序产生更快的调优过程。对于规则,可以通过设置来排除零MF指数AllowEmpty可调设置,这减少了学习阶段的规则总数。

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

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

本地函数

函数plotActualAndExpectedResultsWithRMSE (fis, x, y)%计算实际结果和预期结果之间的RMSE(rmse actY] = calculateRMSE (fis, x, y);%绘制结果图次要情节(2,1,1)酒吧(actY)栏(y)栏(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)%评估金融中间人actY = evaluateFIS (fis, x);%计算RMSEdel = actY - y;rmse =√意味着(del。^ 2));结束函数x y = evaluateFIS (fis)指定FIS评估选项持续的evalOptions如果isempty(evalOptions) evalOptions = evalfisOptions(“EmptyOutputFuzzySetMessage”“没有”...“NoRuleFiredMessage”“没有”“OutOfRangeInputValueMessage”“没有”);结束%评估金融中间人x, y = evalfis (fis evalOptions);结束

另请参阅

|||

相关的话题