概述
FIS——利用Matlab创建模糊推理系统Ⅰ
模糊推理是在很多地方都会用到一种方法,可以很好模拟人对于不确定事物的认识和判断,尤其是在模拟人的认识决策这方面,可以十分简洁的表达出来,可以说是人工智能的在很早的时候的表现。matlab中就有官方的工具包供我们使用,使用方法也很简单,这里简单概括一下。
这里来介绍一下matlab中fuzzy logic toolbox的使用方法。有关模糊推理的基础知识这里就不去详细介绍了,这里仅就相关代码操作方面给予总结介绍。更详细的了解,可以在matlab的help document中找到十分详细的介绍,本文就是对其的简要总结。
Fuzzy Logic Designer
通过Fuzzy Logic Designer应用程序创建和编辑模糊推理系统,是最简单直观的创建模糊推理系统的方式了,网络上这些教程很多。我这里也就简单说一下。
要打开Fuzzy Logic Designer,请在MATLAB提示符下键入以下命令:fuzzyLogicDesigner
Fuzzy Logic Designer将打开并显示一个模糊推理系统的图,其左侧为每个输入变量的名称,右侧为每个输出变量的名称,如下图所示。
整个界面很简单直观,是一个双输入单输出的结构,黄色区域为输入变量,蓝色区域为输出变量,双击这些区域可以进入输入(输出)的参数设置界面,如下。其中可以设置是变量的取值范围(range)、隶属度函数类型以及参数、或者更改隶属度函数数量。
白色区域是规则设置,用来编辑if-then逻辑规则
Import and Export Fuzzy Inference Systems
将模糊系统保存到文件时,将使用文件后缀保存该系统的ASCII文本FIS文件表示形式.fis。不要手动编辑**.fis**
文件的内容。这样做会在加载文件时产生意外的结果。将模糊系统保存到MATLAB工作区时,您将创建一个变量,用作模糊系统的MATLAB对象。
Build Fuzzy Systems at the Command Line
利用FIS Designer创建模糊系统虽然很简单直观,但还是需要了解一下它根本的代码,才好!
我们用上面也用到的例子FIS-tipper,这个例子是matlab内置的一个fis
fis = readfis('tipper.fis');
可以使用fis.
访问FIS属性。例如,查看模糊系统的input。
fis.Inputs
#ans =
1x2 fisvar array with properties:
Name
Range
MembershipFunctions
Details:
Name Range MembershipFunctions
_________ _______ ___________________
1 "service" 0 10 {1x3 fismf}
2 "food" 0 10 {1x2 fismf}
更进一步的理解,其实设计的整个模糊推理系统,无论使用应用程序创建还是代码命令创建,其实在matlab中的数据结构就是一个对象,FIS object。
这些对象包含所有模糊推理系统信息,包括变量名称,隶属函数定义和模糊推理方法。每个FIS本身都是对象的层次结构。在模糊系统中使用以下对象:
fisvar
对象代表输入和输出变量。fismf
对象代表每个输入和输出变量中的隶属函数。fisrule
对象表示将输入映射到输出的模糊规则。
通过直接列出其属性来查看FIS的所有信息。
fis
#fis =
mamfis with properties:
Name: "gratuity"
AndMethod: "min"
OrMethod: "max"
ImplicationMethod: "min"
AggregationMethod: "max"
DefuzzificationMethod: "centroid"
Inputs: [1x2 fisvar]
Outputs: [1x1 fisvar]
Rules: [1x3 fisrule]
DisableStructuralChecks: 0
还可以使用plotfis
,plotmf
和gensurf
功能。plotfis将整个系统显示为框图,就和Fuzzy Logic Designer中所显示的图一致。
plotfis(fis) #整个系统流程图
plotmf(fis,'input',1) #输入量的隶属度函数
plotmf(fis,'output',1) #输出的隶属度函数
fis.Rules #模糊规则if-then
gensurf(fis) #输出三维图像
现在说下怎么新建一个FIS object,下面是输入输出变量以及隶属度函数
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");
#Add the second input variable for the food quality, 梯形隶属度函数
fis = addInput(fis,[0 10],'Name',"food");
fis = addMF(fis,"food","trapmf",[-2 0 1 3],'Name',"rancid");
fis = addMF(fis,"food","trapmf",[7 9 10 12],'Name',"delicious");
#Add the output variable for the tip, 三角隶属度函数
fis = addOutput(fis,[0 30],'Name',"tip");
fis = addMF(fis,"tip","trimf",[0 5 10],'Name',"cheap");
fis = addMF(fis,"tip","trimf",[10 15 20],'Name',"average");
fis = addMF(fis,"tip","trimf",[20 25 30],'Name',"generous");
接下来介绍一下模糊规则是如何定义的,是以一个矩阵的形式进行定义,以tipper.fis
中的规则为例介绍一下。
tipper
的规则如下:
- If (service is poor) or (food is rancid), then (tip is cheap).
- If (service is good), then (tip is average).
- If (service is excellent) or (food is delicious), then (tip is generous).
矩阵每一列的含义如下:
- Column 1 - Index of membership function for first input
- Column 2 - Index of membership function for second input
- Column 3 - Index of membership function for output
- Column 4 - Rule weight (from
0
to1
) - Column 5 - Fuzzy operator (
1
for AND,2
for OR)
可以对应到3×5的矩阵
ruleList = [1 1 1 1 2;
2 0 2 1 1;
3 2 3 1 2];
fis = addRule(fis,ruleList);
Evaluate Fuzzy Inference System 结果输出
evalfis(fis,[1 2])
ans = 5.5586
inputs = [3 5;
2 7;
3 1];
evalfis(fis,inputs)
ans = 3×1
12.2184
7.7885
8.9547
参数标定
对于FIS中隶属度函数的确定或是模糊规则if-then的确定,一般都是凭借设计人员的经验来确定这些参数,参数包括隶属度函数的类型,函数中的参数,规则的确定。但人的经验在模糊的问题上起到的作用很小,很难去确定系统的准确性。
因此,有许多参数标定的方法可以被使用,这方面的论文也有蛮多。一般都是利用大量的数据集去训练模型,让模型学习到一个最佳的参数集合状态。还有一种就是在没有输入输出训练数据集的时候,自定义cost函数,通过评估输出的cost,来优化参数。
这一部分内容留到下一部分详细说一下。
参考资料:
[1]matlab help document
https://www.mathworks.com/help/fuzzy/what-is-fuzzy-logic.html
最后
以上就是火星上方盒为你收集整理的FIS学习——利用Matlab创建模糊推理系统ⅠFIS——利用Matlab创建模糊推理系统Ⅰ的全部内容,希望文章能够帮你解决FIS学习——利用Matlab创建模糊推理系统ⅠFIS——利用Matlab创建模糊推理系统Ⅰ所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复