模糊推理系统的调优与相关操作
1. tunefis 函数介绍
1.1 语法
-
fisout = tunefis(fisin,paramset,in,out):使用paramset中指定的可调参数设置以及in和out指定的训练数据来调整模糊推理系统fisin。 -
fisout = tunefis(fisin,paramset,custcostfcn):使用自定义成本函数句柄custcostfcn来调整模糊推理系统。 -
fisout = tunefis( ___ ,options):使用tunefisOptions创建的对象options中的附加选项来调整模糊推理系统。 -
[fisout,summary] = tunefis( ___ ):调整模糊推理系统,并在summary中返回有关调整算法的附加信息。
1.2 输入参数
| 参数 | 说明 |
|---|---|
fisin
|
模糊推理系统,可以是
mamfis
对象、
sugfis
对象、
mamfistype2
对象、
sugfistype2
对象或
fistree
对象
|
paramset
|
可调参数设置,通过
getTunableSettings
函数从
fisin
中获取的输入、输出和规则参数设置的数组
|
in
|
输入训练数据,为
m-by-n
矩阵,
m
是输入数据集的总数,
n
是输入的数量
|
out
|
输出训练数据,为
m-by-q
矩阵,
m
是输出数据集的总数,
q
是输出的数量
|
options
|
FIS 调整选项,为
tunefisOptions
对象
|
custcostfcn
| 自定义成本函数,为函数句柄 |
1.3 输出参数
| 参数 | 说明 |
|---|---|
fisout
|
调整后的模糊推理系统,与
fisin
类型相同
|
summary
|
调整算法的摘要,包含
tuningOutputs
、
totalFunctionCount
、
totalRuntime
和
errorMessage
等字段
|
1.4 示例
1.4.1 调整模糊推理系统
% 创建初始模糊推理系统
x = (0:0.1:10)';
y = sin(2*x)./exp(x/5);
options = genfisOptions('GridPartition');
options.NumMembershipFunctions = 5;
fisin = genfis(x,y,options);
% 获取模糊推理系统的输入、输出和规则的可调设置
[in,out,rule] = getTunableSettings(fisin);
% 使用 “anfis” 调整隶属度函数参数
fisout = tunefis(fisin,[in;out],x,y,tunefisOptions("Method","anfis"));
1.4.2 调整模糊推理系统的特定参数设置
% 创建初始模糊推理系统
x = (0:0.1:10)';
y = sin(2*x)./exp(x/5);
options = genfisOptions('GridPartition');
options.NumMembershipFunctions = 5;
fisin = genfis(x,y,options);
% 获取模糊推理系统的输入、输出和规则的可调设置
[in,out,rule] = getTunableSettings(fisin);
% 仅调整规则参数,使用模式搜索方法
fisout = tunefis(fisin,rule,x,y,tunefisOptions("Method","patternsearch"));
1.4.3 使用自定义参数设置调整模糊推理系统
% 创建初始模糊推理系统
x = (0:0.1:10)';
y = sin(2*x)./exp(x/5);
options = genfisOptions('GridPartition');
options.NumMembershipFunctions = 5;
fisin = genfis(x,y,options);
% 获取模糊推理系统的输入、输出和规则的可调设置
[in,out,rule] = getTunableSettings(fisin);
% 自定义参数设置
in(1) = setTunable(in(1),false);
out(1).MembershipFunctions(1:2) = setTunable(out(1).MembershipFunctions(1:2),false);
out(1).MembershipFunctions(3).Parameters.Free = false;
out(1).MembershipFunctions(4).Parameters.Minimum = -2;
out(1).MembershipFunctions(5).Parameters.Maximum = 2;
rule(1:2) = setTunable(rule(1:2),false);
rule(3).Antecedent.Free = false;
rule(4).Antecedent.AllowNot = true;
rule(3).Consequent.AllowEmpty = false;
% 设置最大迭代次数为 20 并调整模糊推理系统
opt = tunefisOptions("Method","particleswarm");
opt.MethodOptions.MaxIterations = 20;
fisout = tunefis(fisin,[in;out;rule],x,y,opt);
1.4.4 使用 K 折交叉验证防止过拟合
% 加载训练数据
load fuzex1trnData.dat
inputData = fuzex1trnData(:,1);
outputData = fuzex1trnData(:,2);
% 创建模糊推理系统
opt = genfisOptions('GridPartition');
opt.NumMembershipFunctions = 4;
opt.InputMembershipFunctionType = "gaussmf";
fis = genfis(inputData,outputData,opt);
% 设置随机数生成器种子
rng('default')
% 配置 FIS 调整选项
tuningOpt = tunefisOptions;
tuningOpt.MethodOptions.MaxGenerations = 30;
tuningOpt.KFoldValue = 3;
tuningOpt.ValidationWindowSize = 2;
tuningOpt.ValidationTolerance = 0.05;
% 获取 FIS 隶属度函数参数的可调设置
[in,out] = getTunableSettings(fis);
% 调整 FIS
[outputFIS,info] = tunefis(fis,[in;out],inputData,outputData,tuningOpt);
% 评估调整后的 FIS
outputTuned = evalfis(outputFIS,inputData);
% 绘制输出结果
plot([outputData,outputTuned])
legend("Expected Output","Tuned Output","Location","southeast")
xlabel("Data Index")
ylabel("Output value")
1.5 流程图
graph TD;
A[创建初始模糊推理系统] --> B[获取可调设置];
B --> C{选择调整方法};
C -- anfis --> D[使用 anfis 调整];
C -- patternsearch --> E[使用 patternsearch 调整];
C -- particleswarm --> F[使用 particleswarm 调整];
D --> G[输出调整后的 FIS];
E --> G;
F --> G;
2. update 函数介绍
2.1 语法
ruleOut = update(ruleIn,fis)
:使用模糊推理系统
fis
中的信息更新模糊规则
ruleIn
,并在
ruleOut
中返回结果模糊规则。
2.2 输入参数
| 参数 | 说明 |
|---|---|
ruleIn
|
模糊规则,可以是
fisrule
对象或
fisrule
对象的数组
|
fis
|
模糊推理系统,可以是
mamfis
对象、
sugfis
对象、
mamfistype2
对象或
sugfistype2
对象
|
2.3 输出参数
| 参数 | 说明 |
|---|---|
ruleOut
|
模糊规则,为
fisrule
对象或
fisrule
对象的数组
|
2.4 示例
2.4.1 使用文本描述创建模糊规则
% 使用详细文本描述创建模糊规则
rule = fisrule("if service is poor and food is delicious then tip is average (1)");
% 或者使用符号文本描述指定相同的规则
rule = fisrule("service==poor & food==delicious => tip=average")
% 在使用规则之前,使用 update 函数更新规则的 Antecedent 和 Consequent 属性
fis = readfis("tipper");
rule = update(rule,fis)
2.4.2 使用数字描述创建模糊规则
% 使用数字描述创建模糊规则
rule = fisrule([1 2 2 0.5 1],2)
% 在使用规则之前,使用 update 函数更新规则的 Description 属性
fis = readfis("tipper");
rule = update(rule,fis)
3. writeFIS 函数介绍
3.1 语法
-
writeFIS(fis,fileName):将模糊推理系统fis保存到当前工作文件夹中,使用文件名fileName。 -
writeFIS(fis):打开一个对话框,用于保存 FIS。在对话框中,指定.fis文件的名称和位置。 -
writeFIS(fis,fileName,"dialog"):打开一个对话框,用于保存 FIS,将对话框中的文件名设置为fileName。在对话框中,指定文件的位置。
3.2 输入参数
| 参数 | 说明 |
|---|---|
fis
|
模糊推理系统,可以是
mamfis
对象、
sugfis
对象、
mamfistype2
对象或
sugfistype2
对象
|
fileName
|
文件名,为字符串或字符向量。如果未在文件名中指定
.fis
扩展名,
writeFIS
会添加该扩展名
|
3.3 示例
% 创建模糊推理系统
fis = mamfis('Name','tipper');
fis = addInput(fis,[0 10],'Name','service');
fis = addMF(fis,'service','gaussmf',[1.5 0],'Name','poor');
fis = addMF(fis,'service','gaussmf',[1.5 5],'Name','good');
fis = addMF(fis,'service','gaussmf',[1.5 10],'Name','excellent');
% 保存模糊系统到文件
writeFIS(fis,'myFile');
4. zmf 函数介绍
4.1 语法
y = zmf(x,params)
:使用基于样条的 Z 形隶属度函数计算模糊隶属度值。
4.2 输入参数
| 参数 | 说明 |
|---|---|
x
| 输入值,可以是标量或向量 |
params
|
隶属度函数参数,为长度为 2 的向量
[a b]
|
4.3 输出参数
| 参数 | 说明 |
|---|---|
y
|
隶属度值,为标量或向量,其维度与
x
相同
|
4.4 示例
% 指定输入值
x = 0:0.1:10;
% 计算隶属度函数值
y = zmf(x,[3 7]);
% 绘制隶属度函数
plot(x,y)
title('zmf, P = [3 7]')
xlabel('x')
ylabel('Degree of Membership')
ylim([-0.05 1.05])
4.5 替代功能
可以使用
fismf
对象来创建和评估实现
zmf
隶属度函数的对象。
mf = fismf("zmf",P);
Y = evalmf(mf,X);
5. anfisOptions 对象介绍
5.1 描述
使用
anfisOptions
对象为
anfis
函数指定调整模糊系统的选项,例如要调整的初始 FIS 结构和训练周期数。
5.2 创建语法
-
opt = anfisOptions:创建用于使用anfis调整 Sugeno 模糊推理系统的默认选项集。 -
opt = anfisOptions(Name,Value):使用一个或多个名称 - 值参数设置属性。
5.3 属性
| 属性 | 说明 | 默认值 |
|---|---|---|
InitialFIS
| 要调整的初始 FIS 结构,可以是大于 1 的正整数、正整数向量或 FIS 结构 | 2 |
EpochNumber
| 最大训练周期数 | 10 |
ErrorGoal
| 训练误差目标 | 0 |
InitialStepSize
| 初始训练步长 | 0.01 |
StepSizeDecreaseRate
| 步长减小率 | 0.9 |
StepSizeIncreaseRate
| 步长增加率 | 1.1 |
DisplayANFISInformation
| 显示 ANFIS 信息的标志 | 1 |
DisplayErrorValues
| 显示训练误差值的标志 | 1 |
DisplayStepSize
| 显示步长的标志 | 1 |
DisplayFinalResults
| 显示最终结果的标志 | 1 |
ValidationData
| 用于防止过拟合到训练数据的验证数据 | [] |
OptimizationMethod
| 隶属度函数参数训练中使用的优化方法 | 1 |
5.4 示例
% 创建默认选项集
opt = anfisOptions;
% 使用点表示法指定训练选项
opt.InitialFIS = 4;
opt.EpochNumber = 30;
% 或者在创建选项集时使用名称 - 值对参数指定选项
opt2 = anfisOptions('InitialFIS',4,'EpochNumber',30);
6. 各函数与对象的综合应用分析
6.1 函数与对象之间的关联
在模糊推理系统的构建和调整过程中,
tunefis
、
update
、
writeFIS
、
zmf
函数以及
anfisOptions
对象相互协作,共同完成模糊系统的设计、优化和保存等任务。以下是它们之间的关联分析:
-
tunefis
与
anfisOptions
:
tunefis
函数用于调整模糊推理系统,而
anfisOptions
对象可以为
anfis
方法提供详细的调整选项。例如,在使用
tunefis
函数时,可以通过
tunefisOptions
对象设置训练周期数、初始步长等参数,从而更精确地控制调整过程。
-
update
与
tunefis
:
update
函数用于更新模糊规则,确保规则的
Antecedent
和
Consequent
属性与模糊推理系统中的隶属度函数相匹配。在使用
tunefis
调整模糊系统之前,可能需要使用
update
函数对规则进行更新,以保证规则的正确性。
-
writeFIS
与其他函数
:
writeFIS
函数用于将调整好的模糊推理系统保存到文件中。在使用
tunefis
调整系统后,可以使用
writeFIS
函数将结果保存,以便后续使用或分享。
-
zmf
与模糊系统构建
:
zmf
函数用于计算 Z 形隶属度函数的值,是构建模糊推理系统中隶属度函数的重要工具。在创建模糊推理系统时,可以使用
zmf
函数定义输入和输出变量的隶属度函数。
6.2 综合应用示例
以下是一个综合应用上述函数和对象的示例,展示了如何从创建模糊推理系统到调整、保存的完整过程:
% 1. 创建初始模糊推理系统
x = (0:0.1:10)';
y = sin(2*x)./exp(x/5);
options = genfisOptions('GridPartition');
options.NumMembershipFunctions = 5;
fisin = genfis(x,y,options);
% 2. 获取可调设置
[in,out,rule] = getTunableSettings(fisin);
% 3. 自定义参数设置
in(1) = setTunable(in(1),false);
out(1).MembershipFunctions(1:2) = setTunable(out(1).MembershipFunctions(1:2),false);
out(1).MembershipFunctions(3).Parameters.Free = false;
out(1).MembershipFunctions(4).Parameters.Minimum = -2;
out(1).MembershipFunctions(5).Parameters.Maximum = 2;
rule(1:2) = setTunable(rule(1:2),false);
rule(3).Antecedent.Free = false;
rule(4).Antecedent.AllowNot = true;
rule(3).Consequent.AllowEmpty = false;
% 4. 配置调整选项
opt = tunefisOptions("Method","particleswarm");
opt.MethodOptions.MaxIterations = 20;
% 5. 调整模糊推理系统
fisout = tunefis(fisin,[in;out;rule],x,y,opt);
% 6. 保存调整后的模糊推理系统
writeFIS(fisout,'adjustedFIS');
6.3 流程图
graph TD;
A[创建初始模糊推理系统] --> B[获取可调设置];
B --> C[自定义参数设置];
C --> D[配置调整选项];
D --> E[调整模糊推理系统];
E --> F[保存调整后的系统];
7. 注意事项和常见问题解答
7.1 注意事项
-
文件操作
:在使用
writeFIS函数保存模糊推理系统时,不要手动编辑.fis文件的内容,否则可能会导致在使用readfis等函数加载文件时出现意外结果。 -
对象和结构的兼容性
:从 R2019b 开始,逐渐移除对将模糊推理系统表示为结构的支持,建议使用
mamfis和sugfis对象。如果需要将现有的模糊推理系统结构转换为对象,可以使用convertfis函数。 - 随机数生成器 :在使用 K 折交叉验证等需要随机划分数据的方法时,建议设置随机数生成器的种子,以保证结果的可重复性。
7.2 常见问题解答
-
问题 1:如何选择合适的调整方法?
-
解答:不同的调整方法适用于不同的场景。例如,
anfis方法适用于调整 Sugeno 型模糊推理系统,它结合了反向传播和最小二乘法估计;patternsearch方法适用于搜索特定参数的最优值;particleswarm方法适用于全局优化问题。可以根据具体问题和数据特点选择合适的方法。
-
解答:不同的调整方法适用于不同的场景。例如,
-
问题 2:如果在调整过程中出现误差过大的情况怎么办?
-
解答:可以尝试调整
anfisOptions对象中的参数,如增加训练周期数、调整初始步长等。也可以检查输入数据是否存在异常值,或者尝试使用不同的隶属度函数。
-
解答:可以尝试调整
-
问题 3:如何确保模糊规则的正确性?
-
解答:在使用模糊规则之前,使用
update函数对规则进行更新,确保规则的Antecedent和Consequent属性与模糊推理系统中的隶属度函数相匹配。同时,在创建规则时,要仔细检查规则的逻辑是否合理。
-
解答:在使用模糊规则之前,使用
8. 总结
本文详细介绍了模糊推理系统相关的函数和对象,包括
tunefis
、
update
、
writeFIS
、
zmf
函数以及
anfisOptions
对象。通过具体的示例和操作步骤,展示了如何创建、调整和保存模糊推理系统,以及如何使用 K 折交叉验证防止过拟合。同时,分析了各函数和对象之间的关联和综合应用方法,并给出了注意事项和常见问题解答。希望本文能够帮助读者更好地理解和应用模糊推理系统,解决实际问题。
在实际应用中,读者可以根据具体需求选择合适的函数和方法,灵活调整参数,以达到最佳的效果。同时,不断探索和尝试新的方法和技巧,提高模糊推理系统的性能和准确性。
超级会员免费看
49

被折叠的 条评论
为什么被折叠?



