主要内容

Tune Mamdani模糊推理系统

这个例子展示了如何调整隶属函数(MF)和规则参数的Mamdani模糊推理系统(FIS)。这个例子使用粒子群和模式搜索优化,这需要全局优化工具箱™软件。

以每加仑英里数(MPG)计算的汽车油耗预测是一个典型的非线性回归问题。它利用汽车的几个外形属性来预测油耗。加州大学欧文分校(University of California at Irvine)提供训练数据机器学习库并包含了从不同品牌和型号的汽车中收集的数据。

本例使用以下6个输入数据属性来预测FIS的输出数据属性MPG:

  1. 气缸数

  2. 位移

  3. 马力

  4. 重量

  5. 加速度

  6. 模型一年

准备数据

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

(数据、名称)= loadGasData;

从属性名中删除前导和尾随空格。

name = strtrim (string(名称));

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

  • 气缸数

  • 位移

  • 马力

  • 重量

  • 加速度

  • 模型一年

第七列包含输出属性MPG。

创建单独的输入和输出数据集,XY,分别。

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

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

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

提取每个数据属性的范围,您将在FIS构造期间使用它来定义输入/输出范围。

dataRange = [min(数据)' max(数据)'];

使用数据属性范围构造FIS

创建一个用于调优的Mamdani FIS。

fisin = mamfis;

向FIS添加输入和输出变量,其中每个变量代表一个数据属性。对于每个变量,使用相应的属性名和范围。

为了减少规则的数量,对每个输入变量使用两个mf,这将导致 2 6 64 输入MF的组合。因此,FIS最多使用64条对应输入MF组合的规则。

为了改进训练数据之外的数据泛化,输出变量使用64 mf。这样做允许FIS为每个规则使用不同的输出MF。

输入和输出变量都使用默认的三角形mf,它们均匀分布在变量范围内。

i = 1:6 fisin = addInput(fisin,dataRange(i,:)),“名字”,(我),“NumMFs”2);结束fisin = addOutput (fisin dataRange (7:)“名字”、名称(7)“NumMFs”, 64);

查看FIS结构。最初,FIS没有任何规则。系统的规则是在调优过程中发现的。

图plotfis (fisin)

图中包含8个轴对象。坐标轴对象1包含2个类型为line的对象。axis对象2包含2个类型为line的对象。坐标轴对象3包含2个类型为line的对象。axis对象4包含2个类型为line的对象。axis对象5包含2个类型为line的对象。轴对象6包含2个类型为line的对象。axis对象7包含64个类型为line的对象。axis对象8包含3个类型为text的对象。

使用训练数据调整FIS

调优分两个步骤执行。

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

  2. 调整输入/输出MFs和规则的参数。

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

学习规则

要学习规则库,首先使用tunefisOptions对象。由于FIS允许大量输出MFs(在规则结果中使用),所以使用全局优化方法(遗传算法或粒子群)。与局部优化方法(模式搜索和模拟退火)相比,这种方法在大参数调整范围内的性能更好。对于本例,使用粒子群优化方法(“particleswarm”).

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

选择= tunefisOptions (“方法”“particleswarm”...“OptimizationType”“学习”...“NumMaxRules”, 64);

如果您有Parallel Computing Toolbox™软件,您可以通过设置来提高调优过程的速度选项。UseParallel真正的.如果您没有“并行计算工具箱”软件,请设置选项。UseParallel

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

options.MethodOptions.MaxIterations = 20;

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

rng (“默认”

使用指定的调优数据和选项调优FIS。

使用的学习规则tunefis功能大约需要5分钟。对于本例,通过设置启用调优runtunefis真正的.在不跑步的情况下加载预先训练的结果tunefis,您可以设置runtunefis

runtunefis = false;

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

如果runtunefis fisout1 = tunefis(fisin,[],trnX,trnY,options);% #好< UNRCH >其他的tunedfis =负载(“tunedfismpgprediction.mat”);fisout1 = tunedfis.fisout1;流(’训练RMSE = %。3 f MPG \ n”calculateRMSE (fisout1 trnX trnY));结束
训练RMSE = 4.452 MPG

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

查看调谐FIS的结构,fisout1

plotfis (fisout1)

图中包含8个轴对象。坐标轴对象1包含2个类型为line的对象。axis对象2包含2个类型为line的对象。坐标轴对象3包含2个类型为line的对象。axis对象4包含2个类型为line的对象。axis对象5包含2个类型为line的对象。轴对象6包含2个类型为line的对象。axis对象7包含64个类型为line的对象。axis对象8包含3个类型为text的对象。

学习过程为FIS制定了一套新的规则。例如,查看前三条规则的描述信息。

[fisout1.Rules (1:3) .Description]
ans =3 x1字符串"Cylinder==mf2 & Disp==mf2 & Power==mf2 & Weight==mf2 & Year==mf2 => MPG=mf5 (1)""气缸==mf1 & Power==mf2 & Weight==mf2 & Acceler==mf2 & Year==mf1 => MPG=mf63 (1)""Cylinder==mf2 & Disp==mf1 & Acceler==mf2 => MPG=mf28 (1)"

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

计算生成的输出数据和验证输出数据集之间的RMSEvldY

plotActualAndExpectedResultsWithRMSE (fisout1 vldX vldY)

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

由于训练和验证错误是相似的,学习的系统不会过度拟合训练数据。

调整所有参数

学习新规则后,根据学习规则的参数调整输入/输出MF参数。如果需要获取FIS的可调参数,请使用getTunableSettings函数。

[,,规则]= getTunableSettings (fisout1);

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

选项。OptimizationType =“优化”

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

选项。方法=“patternsearch”

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

options.MethodOptions.MaxIterations = 60;

为了改善模式搜索结果,设置方法选项UseCompletePoll为true。

options.MethodOptions.UseCompletePoll = true;

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

tunefis功能大约需要5分钟。在不跑步的情况下加载预先训练的结果tunefis,您可以设置runtunefis

如果runtunefis rng (“默认”% #好< UNRCH >fisout = tunefis (fisout1;;规则,trnX, trnY,选项);其他的fisout = tunedfis.fisout;流(’训练RMSE = %。3 f MPG \ n”calculateRMSE (fisout trnX trnY));结束
训练RMSE = 2.903 MPG

在调谐过程的最后,一些调谐的MF形状不同于原来的形状。

图plotfis (fisout)

图中包含8个轴对象。坐标轴对象1包含2个类型为line的对象。axis对象2包含2个类型为line的对象。坐标轴对象3包含2个类型为line的对象。axis对象4包含2个类型为line的对象。axis对象5包含2个类型为line的对象。轴对象6包含2个类型为line的对象。axis对象7包含64个类型为line的对象。axis对象8包含3个类型为text的对象。

检查性能

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

比较从验证输出数据集获得的预期MPGvldY和实际MPG产生使用fisout.计算这些结果之间的均方根误差。

plotActualAndExpectedResultsWithRMSE (fisout vldX vldY);

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

与从初始学习的规则库中得到的结果相比,调整FIS参数可以改善RMSE。由于训练和验证错误是相似的,所以参数值不会被调优。

结论

可以通过以下方法进一步改善调谐FIS的训练误差:

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

  • 使用全局优化方法,例如遗传算法particleswarm,在规则学习和参数调优阶段。遗传算法particleswarm因为它们是全局优化器,所以在较大的参数调优范围内性能更好。另一方面,patternsearchsimulannealbnd小参数范围的性能更好,因为它们是局部优化器。如果FIS是由训练数据生成的genfis或者已经使用训练数据添加了一个规则库到FIS,那么patternsearchsimulannealbnd可以产生更快的收敛遗传算法particleswarm.有关这些优化方法及其选项的更多信息,请参见遗传算法(全局优化工具箱)particleswarm(全局优化工具箱)patternsearch(全局优化工具箱),simulannealbnd(全局优化工具箱)

  • 修改FIS属性,如FIS的类型、输入数量、输入/输出MF数量、MF类型和规则数量。对于具有大量输入的模糊系统,Sugeno FIS通常比Mamdani FIS收敛更快,因为Sugeno系统具有更少的输出MF参数(如果常数使用MFs)和更快的去模糊。少量的mf和规则减少了要调优的参数数量,从而产生了更快的调优过程。此外,大量规则可能会对训练数据进行过拟合。一般来说,对于较大的模糊系统,与单个FIS相比,FIS树可以用更少的规则产生相似的性能。例如,请参见调整FIS树的汽油里程预测

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

本地函数

函数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])持有xlabel([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)%指定FIS评估选项持续的evalOptions如果isempty(evalOptions) = evalfisOptions(“EmptyOutputFuzzySetMessage”“没有”...“NoRuleFiredMessage”“没有”“OutOfRangeInputValueMessage”“没有”);结束%评估金融中间人actY = evalfis (fis, x, evalOptions);%计算RMSEdel = actY - y;rmse =√意味着(del。^ 2));结束

另请参阅

||

相关的话题