基于减法聚类和ANFIS的郊区通勤模型
这个例子展示了如何使用减法聚类和ANFIS调优,对一个地区产生的汽车出行数量和该地区的人口统计数据之间的关系进行建模。
负载流量数据
本例使用来自特拉华州新城县100个交通分析区域的人口统计和旅行数据。数据集包含五个人口因素作为输入变量:人口、居住单元数、车辆拥有量、家庭收入中位数和总就业人数。该数据包含一个输出变量,即汽车出行次数。
加载训练和验证数据。
负载trafficData
数据集包含100个数据点,75个用于训练,25个用于验证。训练输入数据(datain
)和验证输入数据(valdatain
),每个都有5列表示输入变量。训练输出数据(dataout
)和验证输出数据(valdataout
)每个都有一列表示输出变量。
绘制训练数据。
H =数字;h.位置(3)= 1.5*h.位置(3);Subplot (1,2,1) plot(datain)图例(“人口”,“住宅数目”,“车辆所有权”,...“中等收入”,“就业总人数”,“位置”,“西北”)标题(输入变量的)包含(的数据点) subplot(1,2,2) plot(dataout)图例(“旅行次数”)标题(“输出变量”)包含(的数据点)
集群的数据
减法聚类是一种快速的单步算法,用于估计数据集中的聚类数量和聚类中心。若要使用减法聚类对训练数据进行聚类,请使用subclust
函数。
[C,S] = subclust([datain dataout],0.5);
对于本例,使用的集群影响范围为0.5
.此值表示将数据空间视为单位超立方体时集群的影响范围。指定小的聚类半径通常会在数据中生成许多小聚类,从而生成具有许多规则的FIS。指定大的聚类半径通常会在数据中产生几个大的聚类,并导致较少的规则。
每行C
包含由聚类算法识别的聚类中心的位置。在这种情况下,算法在数据中发现了三个集群。
C
C =3×61.8770 0.7630 0.9170 18.7500 1.5650 2.1830 0.3980 0.1510 0.1320 8.1590 0.6250 0.6480 3.1160 1.1930 1.4870 19.7330 0.6030 2.3850
将训练数据与两个输入变量的聚类中心一起绘制出来。
图绘制(datain (:, 5), dataout (: 1),“。”C (:, 5), C (:, 6),“r *”)传说(“数据”,“集群中心”,“位置”,“东南”)包含(“就业总人数”) ylabel (“行程次数”)标题(“数据和集群中心”)
中的值年代
显示每个数据维的群集中心的影响范围。所有集群中心都有相同的年代
值。
年代
S =1×61.1621 0.4117 0.6555 7.6139 2.8931 1.4395
利用数据聚类生成模糊推理系统
使用genfis
函数生成一个模糊推理系统(FIS)从数据使用减法聚类。
使用聚类方法查找规则的一个重要优点是,与不使用聚类生成的FIS相比,生成的规则更适合输入数据。当输入数据具有高维数时,这种裁剪减少了规则的总数。
首先,创建一个genfisOptions
选项集,指定相同的群集影响范围值。
fisOpt = genfisOptions(“SubtractiveClustering”,...“ClusterInfluenceRange”, 0.5);
使用训练数据和指定的选项生成FIS模型。
fis = genfis(datain,dataout,fisOpt);
基于输入输出训练数据的维度,生成的FIS有五个输入和一个输出。genfis
为输入、输出和成员函数分配默认名称。
生成的FIS对象是一个具有三个规则的一阶Sugeno系统。
showrule (fis,“格式”,“象征”)
ans =3x132字符数组“1。(in1==in1cluster1) & (in2==in2cluster1) & (in3==in3cluster1) & (in4==in4cluster1) & (in5==in5cluster1) => (out1=out1cluster1)(1)' '2。(in1==in1cluster2) & (in2==in2cluster2) & (in3==in3cluster2) & (in4==in4cluster2) & (in5==in5cluster2) => (out1=out1cluster2) (1)' '3(in1==in1cluster3) & (in2==in2cluster3) & (in3==in3cluster3) & (in4==in4cluster3) & (in5==in5cluster3) => (out1=out1cluster3) (1)'
您可以这样定义每个规则:如果FIS的输入(人口、居住单元、车辆数量、收入和就业)强烈地属于一个聚类的代表成员函数,那么输出(旅行次数)必须属于同一个聚类。也就是说,每个规则简单地将输入空间中的一个集群映射到输出空间中的同一个集群。
每个输入和输出变量都有三个成员函数,对应于三个确定的集群。根据聚类中心和聚类影响范围,推导出输入和输出隶属度函数的参数。例如,绘制第一个输入变量的隶属度函数。
图plotmf (fis,“输入”, 1)
评估初始FIS性能
将训练输入值应用到模糊系统中,找到相应的输出值。
Fuzout = evalfis(fis,datain);
计算模糊系统输出值与预期输出值的均方根误差(RMSE)。
trnRMSE = norm(fuzout-dataout)/√(length(fuzout))
trnRMSE = 0.5276
利用验证数据验证模糊系统的性能。
Valfuzout = evalfis(fis,valdatain);valRMSE = norm(valfuzout-valdataout)/√(length(valfuzout))
valRMSE = 0.6179
根据验证数据绘制模型的输出。
图(valdataout)稍等在情节(valfuzout“o”)举行从ylabel (“产值”)传说(“验证数据”,“FIS输出”,“位置”,“西北”)
结果表明,该模型不能很好地预测验证数据。
使用ANFIS调优FIS
为了提高FIS性能,可以使用简称anfis
函数。首先,尝试使用相对较短的训练周期(20个周期)而不使用验证数据,然后根据验证数据测试得到的FIS模型。
opt = anfisOptions(“InitialFIS”金融中间人,...“EpochNumber”, 20岁,...“InitialStepSize”, 0.1);Fis2 = anfis([datain datout],opt);
ANFIS信息:节点数量:44线性参数数量:18非线性参数数量:30总参数数量:48训练数据对数量:75检查数据对数量:0模糊规则数量:3开始训练ANFIS…1 0.527607 2 0.513727 3 0.492996 4 0.499985 5 0.490585 6 0.492924在epoch 7之后步长减小到0.090000。7 0.48733 8 0.485036 9 0.480813 epoch 10后步长增加到0.09900010 0.475097 11 0.469759 12 0.462516 13 0.451177在epoch 14之后步长增加到0.108900。14 0.447856 15 0.444356 16 0.433904 17 0.433739在epoch 18之后步长增加到0.119790。18 0.420408 19 0.420512 20 0.420275已达到指定的epoch号。ANFIS训练在纪元20完成。最小训练RMSE = 0.420275
评估FIS在训练数据和验证数据上的表现。
Fuzout2 = evalfis(fis2,datain);trnRMSE2 = norm(fuzout2-dataout)/√(length(fuzout2))
trnRMSE2 = 0.4203
Valfuzout2 = evalfis(fis2,valdatain);valRMSE2 = norm(valfuzout2-valdataout)/√(length(valfuzout2))
valRMSE2 = 0.5894
模型的性能与训练数据相比有了很大的改善,但与验证数据相比只有轻微的改善。根据验证数据绘制改进的模型输出。
图(valdataout)稍等在情节(valfuzout“o”)情节(valfuzout2“x”)举行从ylabel (“产值”)传说(“验证数据”,...初始FIS: RMSE = "+ num2str (valRMSE),..."调优FIS: RMSE = "+ num2str (valRMSE2),...“位置”,“西北”)
检查ANFIS结果是否过拟合
当调优FIS时,当验证误差开始增加而训练误差继续减少时,您可以检测到过拟合。
要检查模型是否过拟合,请使用简称anfis
用验证数据训练模型200个epoch。首先通过修改现有的ANFIS培训选项来配置anfisOptions
选项设置。指定周期数和验证数据。由于训练周期较多,请在命令窗口中抑制训练信息的显示。
opt.EpochNumber = 200;opt.ValidationData = [valdatain valdataout];opt.DisplayANFISInformation = 0;opt.DisplayErrorValues = 0;opt.DisplayStepSize = 0;opt.DisplayFinalResults = 0;
训练FIS。
[fis3,trnErr,stepSize,fis4,valErr] = anfis([datain dataout],opt);
在这里:
fis3
为训练误差达到最小时的FIS对象。fis4
为验证数据错误达到最小值时的快照FIS对象。stepSize
是训练步长的历史。trnErr
为使用训练数据的RMSE。valErr
为每个训练周期使用验证数据的RMSE。
训练完成后,使用训练和验证数据验证模型。
Fuzout4 = evalfis(fis4,datain);trnRMSE4 = norm(fuzout4-dataout)/sqrt(length(fuzout4))
trnRMSE4 = 0.3393
Valfuzout4 = evalfis(fis4,valdatain);valRMSE4 = norm(valfuzout4-valdataout)/√(length(valfuzout4))
valRMSE4 = 0.5834
训练数据的误差是目前为止最小的,验证数据的误差也比之前稍低。这个结果表明可能存在过拟合,当你将模糊系统与训练数据很好地拟合时,就会发生这种情况,以至于它不再能很好地拟合验证数据。其结果是丧失了一般性。
查看改进后的模型输出。根据验证数据绘制模型输出。
图(valdataout)稍等在情节(valfuzout2“o”)情节(valfuzout4“x”)举行从ylabel (“产值”)传说(“验证数据”,..."调优FIS: RMSE = "+ num2str (valRMSE2),..."最小误差FIS: RMSE = "+ num2str (valRMSE4),...“位置”,“西北”)
接下来,绘制训练误差图trnErr
.
图表(trnErr)标题(“训练误差”)包含(“时代的数量”) ylabel (“错误”)
该图显示,训练误差在第60 epoch左右。
绘制验证错误图valErr
.
图表(valErr)验证错误的)包含(“时代的数量”) ylabel (“错误”)
该图显示,验证数据误差的最小值出现在历元52。过了这一点,它会稍微增加简称anfis
继续最小化与训练数据的误差。这种模式是过度拟合的标志。根据指定的误差容差,绘制验证误差图还可以表明模型泛化测试数据的能力。