模糊推理系统从零实现
在完整的模糊推理系统介绍以及matlab中从零实现(上篇)中,我们对一个完整的模糊推理系统所涉及到的知识点做了一个细致地展述。
进而,我们可以根据实际需要设计一个属于自己的模糊推理系统。主要涉及到以下几个方面的参数设置。
- 系统的输入输出变量
- 变量对应的语义变量,即分类
- 每个语义变量都需要一个隶属度函数与之对应
- 推理规则
本文的模糊推理系统的输入,输出以及相应规则设定如下
- 系统输入为两个,分别为商品评价(差、中、好、极好)、用户购买意愿(弱、中、强、很强)。输入范围都是[0 10]
- 系统输出为用户行为,购买与否。用[0 1]区间的数值表示。大于0.5则为购买。
- 模糊规则考虑为
- rule1: IF 购买意愿很强 THEN ACtion=买
- rule2: IF 商品评价极好且购买意愿为不为弱 THEN Action=买
- rule3: IF 商品评价为差 THEN Action=不买
- rule4: IF 如果商品评价不为差且购买意愿强 THEN Action=买
最终的目的是建成如上的一个推理系统
基本命令介绍
在调用doc fuzzy得到的文档窗口后,对Fuzzy Inference System Modeling中的functions做一个仔细地阅读,不难发现。
matlab在安装工具箱Fuzzy的基础上,给定了几个模糊推理系统:tipper等
因此,我们可以直接通过tipper=readfis('tipper')
调用得到这个完整的系统。还可以通过命令plotfis(tipper)
和showfis(tipper)
对其进行分析。
我们可以看到它有两个输入和一个输出,并且分别具有不同的语义变量和隶属度函数。通过showrule(tipper)
可以看到它设置的规则为
'1. If (service is poor) or (food is rancid) then (tip is cheap) (1) ’
'2. If (service is good) then (tip is average) (1) ’
‘3. If (service is excellent) or (food is delicious) then (tip is generous) (1)’
创建一个新的FIS
事实上,我们可以将工具箱自带的tipper做进一步优化。添加更多的输入,更完整的规则等。而这一点,在我们成功实现一个自己的系统后很容易做到。
我们通过fis=newfis(name)
命令生成一个空的fis,并且在初始化的过程中,fis的类型,逻辑运算等都选择为默认值。
可以发现,生成的基本fis中,模糊规则前件的与对应min,或对应max,再将前件的隶属度同后件的隶属度函数比较取较小者。结合不同规则得到的输出隶属度值,取面积最大的情形,最后通过centorid,即面积重心的去模糊方法得到输出的数值。
在大多数时候,我们是不需要更改这些基础设定的。我们所需要做的就是,添加输入输出,语义变量以及隶属度函数,并且设定好相应的规则即可。如果需要对这些基础设定作出更改。可以通过命令setfig()
进行改动。具体的可以参考该命令的帮助文档。
设定输入、输出
- 所用到的添加变量函数命令
fis=addvar(fis,varType,varName,varBounds)
,即设定参数的类型:输入or输出,输入的名称和区间。
因此,我们设定输入输出分别为:- fis=addvar(fis,‘input’,‘Attitude’,[0 10])
- fis=addvar(fis,‘input’,‘Comment’,[0 10])
- fis=addvar(fis,‘output’,‘Action’,[0 1])
此时,我们可以看到系统的参数增加了。
与之对应的命令是fis = rmvar(fis,varType,varIndex)
用于移除设定好的输入输出变量。
- 添加隶属度函数命令
命令:fis = addmf(fis,varType,varIndex,mfName,mfType,mfParams)
,形参含义如下表
形参 | 含义 |
---|---|
varType | 参数类型,输入或输出 |
varIndex | 参数标号,第几个输入或输出 |
mfName | 隶属度函数名称,即语义变量 |
mfType | 选用哪种隶属度函数 |
mfParams | 隶属度函数生产参数 |
shopper=addmf(shopper,‘input’,1,‘weak’,‘gaussmf’,[1 0]);
shopper=addmf(shopper,‘input’,1,‘medium’,‘gaussmf’,[1 3.33]);
shopper=addmf(shopper,‘input’,1,‘strong’,‘gaussmf’,[1 6.77]);
shopper=addmf(shopper,‘input’,1,‘very strong’,‘gaussmf’,[1 10]);
对于输入1的四个语义变量设定相应的隶属