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:NameRangeMembershipFunctionsDetails: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

还可以使用plotfisplotmfgensurf功能。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的规则如下:

  1. If (service is poor) or (food is rancid), then (tip is cheap).
  2. If (service is good), then (tip is average).
  3. 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 to 1)
  • 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.5586inputs = [3 5;2 7;3 1];
evalfis(fis,inputs)
ans = 3×112.21847.78858.9547

参数标定

对于FIS中隶属度函数的确定或是模糊规则if-then的确定,一般都是凭借设计人员的经验来确定这些参数,参数包括隶属度函数的类型,函数中的参数,规则的确定。但人的经验在模糊的问题上起到的作用很小,很难去确定系统的准确性。

因此,有许多参数标定的方法可以被使用,这方面的论文也有蛮多。一般都是利用大量的数据集去训练模型,让模型学习到一个最佳的参数集合状态。还有一种就是在没有输入输出训练数据集的时候,自定义cost函数,通过评估输出的cost,来优化参数。

这一部分内容留到下一部分详细说一下。

参考资料:

[1]matlab help document

https://www.mathworks.com/help/fuzzy/what-is-fuzzy-logic.html

FIS学习——利用Matlab创建模糊推理系统Ⅰ相关推荐

  1. 如何在MATLAB下把模糊推理系统转化为查询表(转载)

    如何在MATLAB下把模糊推理系统转化为查询表(原创) http://foundy.blog.163.com/blog/static/2633834420090212202156/?mode=edit ...

  2. matlab 动态存储图片,利用matlab创建动态图并保存为AVI格式

    利用matlab创建动态图并保存为AVI格式. MATLAB中,创建电影动画的过程分为以下四步: step1:调用moviein函数对内存进行初始化(该步骤在Matlab5.3以上均可省略),创建一个 ...

  3. matlab模糊推理,模糊推理系统的matlab代码

    [实例简介] 该文件包中包含了6个文件,分别为不同的模糊推理系统,主要是用matlab编写的 [实例截图] [核心代码] fuzzy └── fuzzy ├── 158113737anfisExamp ...

  4. matlab神经模糊推理系统

    %数据点个数51 numpts=51; x1=linspace(0,1,numpts); y=.6*sin(pi*x1)+.3*sin(3*pi*x1)+.1*sin(5*pi*x1); data=[ ...

  5. 利用MATLAB模糊控制器实现对水位高度调节SIMULINK仿真(隶属度7分级)

    A.理论分析与设计 (1)确定模糊控制器的输入.输出变量 模糊控制器的两个输入变量,分别选为液位偏差E(设定液位高度r-实测液位高度y)和液位偏差变化率EC,输出模糊变量为控制阀门开度U: (2)确定 ...

  6. HFSS学习笔记(四)利用MATLAB脚本进行HFSS快速建模

    HFSS学习笔记(四)利用MATLAB脚本进行HFSS快速建模 在HFSS中,我们经常会遇到复杂且重复的模型,比如你要画30个不同的矩形块,每个矩形块都有自己的参数比如,a1,a2,-,a30,那么此 ...

  7. ExtAspNet学习-利用AppBox框架快速创建项目(五)—完成项目含源代码

    我们前边四个部分已经完成了框架需要的基础配置, 现在我们来完成项目 1.Subsonic 配置,首先在OraSurvey.DAO中添加App.config配置相关信息 View Code 1 < ...

  8. RN学习笔记02:利用WebStorm创建RN项目

    RN学习笔记02:利用WebStorm创建RN项目 在RN学习笔记01里,安装了node.js与react-native-cli,而且配置了环境变量. 在命令行环境,利用react-native in ...

  9. 5G NR学习理解系列——利用matlab工具生成5G NR信源

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 5G NR学习理解系列--利用matlab工具生成5G NR信源 前言 NR工具箱的使用 直接使用代码 前言 既然发现了4G LTE ...

最新文章

  1. Wireshark如何选择多行
  2. mybatis源码_MyBatis架构和源码
  3. shell 脚本逻辑判断
  4. 解决ubuntu下eclipse 经常崩溃的问题
  5. HDU 4609 3-idiots(FFT)
  6. Java实现最小二乘法线性拟合,传感与检测,单臂半桥全桥实验,江南大学自动化
  7. h5 神策埋点_咕咚技术总监唐平麟:神策使我们的数据平台成本降低约 75%,迭代效率提升 2~3 倍...
  8. pHp30充电宝能用快充吗,65W快充 30分钟充满电 是时候淘汰充电宝了吗?
  9. 计算机网络基础大学教材,《计算机网络技术及应用——大学计算机基础教育规划教材》低价购书_教材教辅考试_孔网...
  10. mysql 5.7.18源码包下载_MYSQL数据库CentOS6.9+Mysql5.7.18源码安装详细教程
  11. java输入一个字符给c赋值_C语言字符串的输入输出
  12. 直接访问WEB-INF目录下的JSP页面的方法
  13. 9个月宝宝还不会爬怎么办?
  14. 小 C 的数学(math)详解
  15. 2020职场自顾自说
  16. IAR设置flash偏移地址问题icf文件
  17. 怎么用c语言让电脑定时开关机,电脑定时开关机,教您怎么设置电脑定时开关机...
  18. 微信公众号 php sdk,GitHub - yuanchenglu/wechat-php-sdk: 微信公众平台 PHP SDK
  19. settextstyle() 设置文本型式函数
  20. 输入、输出电阻与带负载能力的总结

热门文章

  1. 选择应该会从这里开始改变你,眼袋
  2. 高层建筑结构健康监测:智能监测与预警守护建筑安全
  3. 抓取FTP登录名和密码
  4. [I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A
  5. python中下列表达式中返回true的是_下列表达式中,返回True的是()。
  6. C++函数指针定义及调用
  7. lambda函数式接口方法引用Sream
  8. (我决定发N个在线播放的电影出来,当然是免费以稳定,速度又快的)□ 影片名:《艺妓回忆录-新片》(3099)
  9. vulnhub靶机 Os-ByteSec
  10. 微信聊天机器人(推送天气早报、睡前故事、精美图片分享)