Matlab 中绘制模糊隶属度函数

6.2模糊推理结构FIS

6.2.1不使用数据聚类方法从数据生成FIS结构

函数 genfis1

格式

fismat=genfis1(data)

fismat=genfis1(data,numMFs,inmftype,outmftype)

说明genfis1为anfis训练生成一个Sugeno型作为初始条件的FIS结构(初始隶属函数)。genfis1(data,numMFs,inmftype,outmftype)使用对数据的网格分割方法,从训练数据集生成一个FIS结构。Data是训练数据矩阵,除最后一列表示单一输出数据外,它的其它各列表示输入数据。NumMFs是一个向量,它的坐标指定与每一输入相关的隶属函数的数量。如果你想使用每个输入相关的相同数量的隶属函数,那么只须使numMFs成为一个数就足够了。Inmftype是一个字符串数组,它的每行指定与每个输入相关的隶属函数类型。outmftype是一个字符串数组,它的指定与每个输出相关的隶属函数类型

例6-19

>>data=[rand(10,1)10*rand(10,1)-5rand(10,1)];

>>numMFs=[37];

>>mfType=str2mat('pimf','trimf');

>>fismat=genfis1(data,numMFs,mfType);

>>[x,mf]=plotmf(fismat,'input',1);

>>subplot(2,1,1),plot(x,mf);

>>xlabel('input1(pimf)');

>>[x,mf]=plotmf(fismat,'input',2);

>>subplot(2,1,2),plot(x,mf);

>>xlabel('input2(trimf)');

6.2.2使用减法聚类方法从数椐生成FIS结构

函数genfis2

格式

fismat=genfis2(Xin,Xout,radii)

fismat=genfis2(Xin,Xout,radii,xBounds)

fismat=genfis2(Xin,Xout,radii,xBounds,options)

说明Xin是一个矩阵,它的每一行包含一个数据点的输入值;Xout是一个矩阵,它的每一行包含一个数据点的输出值;randi是一个向量,它指定一个聚类中心在一个数据维上作用的范围,这里假定数据位于一个单位超立方体内:xBounds是一个2×N可选矩阵,它用于指定如何将Xin和Xout中的数据映射到一个超立方体内,这里是数据的维数(行数);options是一个可选向量,它指定的值用于覆盖算法参数的缺省值。

例6-20

fismat=genfis2(Xin,Xout,0.5)

这是使用此函数所需的最小变量数。这里对所有数据维指定0.5的作用范围。

fismat=genfis2(Xin,Xout,[0.50.250.3])

这里假定组合的维数是3。假设Xin有两维、Xout有一维,那么,0.5和0.25是Xin数据维中每一维的作用范围,0.3是Xout数据维的作用范围。

fismat=genfis2(Xin,Xout,0.5,[-10-50;10520])

这里指定了如何将Xin和Xout中的数据规范化为[01]区间中的值来进行处理。假设Xin有两维、Xout有一维,那么Xin第一列中的数据是从[-10+10]比例变换后的值,Xin第二列中的数据是从[-5+5]比例变换后的值,Xout中的数据是从[020]比例变换后的值。

6.2.3生成一个FIS输出曲面

函数gensurf

格式

gensurf(fis)%使用前两个输入和第一个输出来生成给定模糊推理系统(fis)的输出曲面

gensurf(fis,inputs,output)%使用分别由向量input和标量output给定的输入(一个或两个)和输出(只允许一个)来生成一个图形。

gensurf(fis,inputs,output,grids)%指定X(第一、水平)和Y(第二、垂直)方向的网格数。如果是二元向量,X和Y方向上的网格可以独立设置。

gensurf(fis,inputs,output,grids,refinput)%用于多于两个的输入,refinput向量的长度与输入相同:

将对应于要显示的输入的refinput项,设置为NaN;

对其它输入的固定值设置为双精度实标量。

[x,y,z]=gensurf(…)%返回定义输出曲面的变量并且删除自动绘图。

例6-21

>>a=readfis('tipper');

>>gensurf(a)

6.2.4将mamdan型FIS转换为SugenoFIS

函数mam2sug

格式sug_fis=mam2sug(mam_fis)

说明该函数将一个mamdani型FIS结构(不必是单输出)mam_fis转化为一个sugeno型结构sug_fis。返回的sugeno型系统具有常值输出隶属度函数。这些常值由原来mamdani型系统的后件的隶属度函数的面积中心法来确定。前件仍保持不变。

6.2.5完成模糊推理计算

函数evalfis

格式

output=evalfis(input,fismat)

output=evalfis(input,fismat,numPts)

[output,IRR,ORR,ARR]=evalfis(input,fismat)

[output,IRR,ORR,ARR]=evalfis(input,fismat,numPts)

说明input:指定输入值的一个数或一个矩阵,如果输入是一个M×N矩阵,其中N是输入变量数,那么evalfis使用input的每一行作为一个输入向量,并且为变量output返回M×L矩阵,该矩阵每一行是一个向量并且L是输出变量数;

fismat:要计算的一个FIS结构;

numPts:一个可选变量,它表示在输入或输出范围内的采样点数,在这些点上计算隶属函数,如果不使用此变量,就使用101点的缺省值。

Evalfis的值域如下:

Output:大小为ML的输出矩阵,这里M表示前面指定的输入值的数量,L表示FIS的输出变量数。

evalfis的可选值域变量只有当input是一个行向量时才计算这些可选值域变量是:

IRR:通过隶属函数计算的输入变量的结果,这是一个大小为numRulesN的矩阵,这里numRules是规则条数,N是输入变量数。

ORR:通过隶属函数计算的输出变量的结果,这是一个大小为numPtsnumRulesL的矩阵,这里numRules是规则条数,L是输出变量数,此矩阵的第一组numRules列,对应于第一个输出,第二组numRules对应于第二个输出,依次类推。

ARR:对每个输出,在输出值域中,numPts处采样合成值的numPtsL矩阵,当只有一个值域变量调用时,该函数使用由结构fismat指定的模糊推理系统,由标量或矩阵inout指定的输入值计算输出向量output。

例6-22

>>fismat=readfis('tipper');

>>out=evalfis([21;49],fismat)

结果为

out=

7.0169

19.6810

6.2.6模糊c均值聚类

函数fcm

格式

[center,U,obj_fcn]=fcm(data,cluster_n)

说明对给定的数据集应用模糊c均值聚类方法进行聚类

data:要聚类的数据集,每行是一个采样数据点;

cluster_n:聚类中心的个数(大于1)

center:迭代后得到的聚类中心的矩阵,这里每行给出聚类中心的坐标;

U:得到的所有点对聚类中心的模糊分类矩阵或隶属度函数矩阵;

Obj_fcn:迭代过程中,目标函数的值;

fcm(data,cluster_n,options)使用可选的变量options控制聚类参数。包括停止准则,和/或设置迭代信息显示:

options(1):分类矩阵U的指数,缺省值是2.0;

options(2):最大迭代次数,缺省值是100;

options(3):最小改进量,即迭代停止的误差准则,缺省值是1e-5;

option(4):迭代过程中显示信息,缺省值是1。

如果任意一项为NaN,这些选项就使用缺省值;当达到最大迭代次数时,或目标函数两次连续迭代的改进量小于指定的最小改进量,即满足停止误差准则时,聚类过程结束。

例6-23

>>data=rand(100,2);

>>[center,U,obj_fcn]=fcm(data,2);

>>plot(data(:,1),data(:,2),'o');

>>maxU=max(U);

>>index1=find(U(1,:)==maxU);

>>index2=find(U(2,:)==maxU);

>>line(data(index1,1),data(index1,2),'linestyle','none','marker','*','color','g');

>>line(data(index2,1),data(index2,2),'linestyle','none','marker','*','color','r');


6.2.7模糊均值和减法聚类

函数findcluster

格式findcluster

findcluster('file.dat')

说明findcluster产生一个GUI上的Method下的下拉式标签,可以实现模糊C均值(fcm)或模糊减法聚类(subtractiv),使用LoadData按钮输入数据,刚进入GUI时,对每种方法的选项都设置为缺省值。

此工具使用多维数据集,但只显示这些维数中的两维。使用X-axis和Y-axis下的下拉式标签选择你想观察的数据维。例如你有一个五维数据集,按照出现在数据集中的顺序,此工具将数据标记为data_1,data_2,data_3,data_4,data_5,Start将完成聚类,SaveCentre将保存聚类中心。

当使用数据集file.data时,findcluster(file.dat)自动装入数据集,并且只绘制数据集中的前两维。产生GUI后,你仍可以选择要聚类数据的那两维。

例6-24

>>findcluster('clusterdemo.dat')

6.2.8绘制一个FIS

函数plotfis

格式plotfis(fismat)

说明此函数显示由fismat指定的一个FIS的高层方框图,输入和它们的隶属函数出现在结构特征图的左边,同时输出和它们的隶属函数出现在结构特征图的右边。

例6-25

>>a=readfis('tipper');

>>plotfis(a)

6.2.9绘制给定变量的所有隶属的曲线

函数plotmf

格式plotmf(fismat,varType,varIndex)

说明此函数绘制与给定变量相关的称为fismat的FIS中的所有隶属函数曲线,变量的类型和索引分别由varType('input'或'output')和varIndex给出。此函数也可以与MATLAB函数subplot一起使用。

例6-26

>>a=readfis('tipper');

>>plotmf(a,'input',1)


6.2.10从磁盘装入一个FIS

函数readfis

格式fismat=readfis('filename')

说明从磁盘上的一个.fis文件(由filename命名)读出一个模糊推理系统,并将产生的FIS装入当前的工作空间中。Fismat=readfis不带输入变量,即没有指定文件名时,使用uigetfile命令打开一个对话框,提示用户指定文件的名称和目录位置。

例6-27

>>fismat=readfis('tipper');

>>getfis(fismat)

返回结果

getfis(fismat)

Name=tipper

Type=mamdani

NumInputs=2

InLabels=

service

food

NumOutputs=1

OutLabels=

tip

NumRules=3

AndMethod=min

OrMethod=max

ImpMethod=min

AggMethod=max

DefuzzMethod=centroid

ans=

tipper

6.2.11从FIS中删除某一隶属函数

函数rmmf

格式fis=rmmf(fis,'varType',varIndex,'mf',mfIndex)

说明从与工作空间FIS结构fis相关的模糊推理系统中删除变量类型为varType,索引为varIndex的隶属函数mfIndex。

字符串vartype必须是'input'或'output'。

varIndex是表示变量索引的一个整数,此索引表示列出变量的顺序;

变量'mf'是表示隶属函数的一个字符串;

mfIndex是表示隶属函数索引的一个整数,此索引表示列出隶属函数的顺序。

例6-28

>>a=newfis('mysys');

>>a=addvar(a,'input','temperature',[0100]);

>>a=addmf(a,'input',1,'cold','trimf',[03060]);

>>getfis(a,'input',1)

返回结果

Name=temperature

NumMFs=1

MFLabels=

cold

Range=[0100]

ans=

[]

>>b=rmmf(a,'input',1,'mf',1);

>>getfis(b,'input',1)

返回

Name=temperature

NumMFs=0

MFLabels=

Range=[0100]

ans=

[]

6.2.12从FIS中删除变量

函数rmvar

格式[fis2,errorStr]=rmvar(fis,'varType',varIndex)

fis2=rmvar(fis,'varType',varIndex)

说明fis2=rmvar(fis,'varType',varIndex),)从与工作空间FIS结构fis相关的模糊推理系统中删除索引为varIndex的语言变量mfIndex,字符串vartype必须是'input'或'output'。

varIndex是表示变量索引的一个整数,此索引表示列出变量的顺序。

[fis2,errorStr]=rmvar(fis,'varType',varIndex)将任何错误信息返回到字符串errorStr。

此命令自动更新规则列表以保证列表尺寸与当前变量数保持一致,在删除语言变量之前,你必须从FIS删除任何包含要删除变量的规则,你无法删除在规则列表中正在使用的模糊变量。

例6-29

>>a=newfis('mysys');

>>a=addvar(a,'input','temperature',[0100]);

>>getfis(a)

返回:

Name=mysys

Type=mamdani

NumInputs=1

InLabels=

temperature

NumOutputs=0

OutLabels=

NumRules=0

AndMethod=min

OrMethod=max

ImpMethod=min

AggMethod=max

DefuzzMethod=centroid

ans=

mysys

>>b=rmvar(a,'input',1);

>>getfis(b)

返回:

Name=mysys

Type=mamdani

NumInputs=0

InLabels=

NumOutputs=0

OutLabels=

NumRules=0

AndMethod=min

OrMethod=max

ImpMethod=min

AggMethod=max

DefuzzMethod=centroid

ans=

mysys

6.2.13设置模糊系统属性

函数setfis

格式a=setfis(a,'fispropname','newfisprop')

a=setfis(a,'vartype',varindex,'varpropname','newvarprop')

a=setfis(a,'vartype',varindex,'mf',mfindex,'mfpropname','newmfprop');

说明可以使用三个、五个或七个输入变量调用setfis命令,使用几个输入变量取决于是否设置整个结构的一个属性,是否设置属于该结构的一个特定变量,还是是否设置属于这些变量之一的一个特定隶属函数。这些变量是:

a:工作空间中FIS的一个变量名称,

vartype:表示变量类型的一个字符串:input或output;

varindex:输入或输出变量的索引;

mf:调用setfis时,七个变量中的第四个变量所用的字符串,用语指明此变量是一个隶属函数;

mfindex:属于所选变量的隶属函数的索引;

fispropname:表示你要设置FIS域属性的一个字符串:name,type,andmethod,ormethod,impmethod,aggmethod,defuzzmethod;

newfisprop:你要设置的FIS的属性或方法名称的一个字符串;

varpropname:你要设置的变量域名称的一个字符串:name或range;

newvarprop:你要设置的变量名称的一个字符串(对name),或变量范围的一个数组(对range),mfpropname—你要设置的隶属函数名称的一个字符串:name,type或params;

newmfprop:你要设置的隶属函数名称或类型域的一个字符串(对name或type)或者是参数范围的一个数组(对params)。

例6-30使用三个变量调用:

>>a=readfis('tipper');

>>a2=setfis(a,'name','eating');

>>getfis(a2,'name');

结果为:

out=

eating

如果使用五个变量,setfis将更新两个变量属性:

>>a2=setfis(a,'input',1,'name','help');

>>getfis(a2,'input',1,'name')

结果为:

ans=

help

如果使用七个变量,setfis将更新七个隶属函数的任意属性:

>>a2=setfis(a,'input',1,'mf',2,'name','wretched');

>>getfis(a2,'input',1,'mf',2,'name')

结果为:

ans=

wretched

6.2.14以分行形式显示FIS结构的所有属性

函数showfis

格式showfis(fismat)

说明以分行方式显示MATLAB工作空间FIS变量fismat,允许你查看结构的每个域的意义和内容。

例6-31

>>a=readfis('tipper');

>>showfis(a)

返回:

Nametipper

Typemamdani

Inputs/Outputs[21]

NumInputMFs[32]

NumOutputMFs3

NumRules3

AndMethodmin

OrMethodmax

ImpMethodmin

AggMethodmax

DefuzzMethodcentroid

InLabelsservice

food

OutLabelstip

InRange[010]

[010]

OutRange[030]

InMFLabelspoor

good

excellent

rancid

delicious

OutMFLabelscheap

average

generous

InMFTypesgaussmf

gaussmf

gaussmf

trapmf

trapmf

OutMFTypestrimf

trimf

trimf

InMFParams[1.5000]

[1.5500]

[1.51000]

[0013]

[791010]

OutMFParams[05100]

[1015200]

[2025300]

RuleAntecedent[11]

[20]

[32]

RuleConsequent1

2

3

RuleWeigth1

1

1

RuleConnection2

1

2

6.2.15完成模糊运算

函数fuzarith

格式C=fuzarith(X,A,B,operator)

说明使用区间算法,C=fuzarith(X,A,B,operator)返回一个模糊集C作为结果,该算法使用由字符串operator表示的函数,并在采样凸模糊集A和B上完成二进制运算;元素A和B由采样值域变量X的凸函数产生;

A,B和X是相同维数的向量;

operator是下列串之一:'sum','sub','prod',and'div';

该函数返回的模糊集C是一个与X具有相同长度的列向量

例6-32

>>point_n=101;%thisdeterminesMF'sresolution

>>min_x=-20;max_x=20;%universeis[min_x,max_x]

>>x=linspace(min_x,max_x,point_n)';

>>A=trapmf(x,[-10-213]);%trapezoidalfuzzysetA

>>B=gaussmf(x,[25]);%GaussianfuzzysetB

>>C1=fuzarith(x,A,B,'sum');

>>subplot(2,1,1);

>>plot(x,A,'b--',x,B,'m:',x,C1,'c');

>>title('fuzzyadditionA+B');

>>C2=fuzarith(x,A,B,'sub');

>>subplot(2,1,2);

>>plot(x,A,'b--',x,B,'m:',x,C2,'c');

>>title('fuzzysubtractionA-B');

>>C3=fuzarith(x,A,B,'prod');


6.2.16解析模糊规则

函数parsrule

格式fis2=parsrule(fis,txtRuleList)

fis2=parsrule(fis,txtRuleList,ruleFormat)

fis2=parsrule(fis,txtRuleList,ruleFormat,lang)

说明此函数为MATLAB工作空间FIS变量fis解析定义规则(txtRuleList)的文本,并且返回添加了相应规则列表的一个FIS结构。如果原始输入FIS结构fis有任意初始规则,他们将由新结构fis2替换。本函数支持三种不同的规则格式(由ruleFormat指定'verbose'(语言型)、'symbolic'(符号型)、'indexed'(索引型)。缺省格式是'verbose'(语言型)。当使用可选语言变量lang时,规则以语言型格式进行解析,并采用语言变量lang中指定的关键字。语言必须是'english'、'francais'或'deutsch'。英语关键字是if、then、is、AND、OR和NOT。

例6-33

>>a=readfis('tipper');

>>ruleTxt='ifserviceispoorthentipisgenerous';

>>a2=parsrule(a,ruleTxt,'verbose');

>>showrule(a2)

结果为

ans=

If(serviceispoor)

then(tipisgenerous)

6.2.17规则编辑器和语法编辑器

函数ruleedit

格式

ruleedit('a')

ruleedit(a)

说明当使用ruleedit('a')调用规则编辑器时,可用于修改存储在文件a.fis中的一个FIS结构的规则。它也可用于检查模糊推理系统使用的规则。为使用编辑器创建规则,你必须首先用FIS编辑器定义要使用的所有输入输出变量,你可以使用列表框和检查框选择输入、输出变量,连接操作和权重来创建新规则。如图所示,用ruleedit('tank')打开规则编辑器并装入tank.fis中存储的所有规则。 

菜单项:在规则编辑器GUI上,有一个菜单棒允许你打开相关的GUI工具、打开和保存系统等。File菜单与FIS编辑器上的File菜单功能相同。

·Edit菜单项包括:

Undo用于恢复最近的改变;

·View菜单项包括:

EditFISproperties…调用FIS编辑器;

Editmembershipfunctions…调用隶属度函数编辑器;

Editrules…调用规则编辑器;

Viewsurface…调用曲面观察器。

·Options菜单项包括:

Language用于选择语言:English、Deutsch和Francais;

Format用于选择格式

·Verbose使用单词“if”、“then”、“AND”、“OR”等创建实际语句。

·Symbolic用某些符号代替Verbose模式中使用的单词。例如:“ifAAND

BthenC”成为“A&B=>C”。

·indexed表示规则如何在FIS结构中存储。

6.2.18规则观察器和模糊推理框图

函数ruleview

格式ruleview('a')

说明使用ruleview('a')调用规则观察器时,将绘制在存储文件a.fis中的一个FIS的模糊推理框图。它用于观察从开始到结束整个蕴含过程。你可以移动对应输入的指示线,然后观察系统重新调节并计算新的输出。如图6-29:ruleview('tank')


菜单项:在规则编辑器GUI上,有一个菜单棒允许你打开相关的GUI工具、打开和保存系统,等等。File菜单与FIS编辑器上的File菜单功能相同。

·View菜单项包括:

EditFISproperties…调用FIS编辑器;

Editmembershipfunctions…调用隶属度函数编辑器;

Editrules…调用规则编辑器;

Viewsurface…调用曲面观察器。

·Options菜单项包括:

Rulesdisplayformat用于选择显示规则的格式。如果单击模糊推理方框图左边的规则序号,与该序号相关的规则出现在规则观察器底部的状态棒中。

6.2.19保存FIS到磁盘上

函数writefis

格式writefis(fismat)


writefis(fismat,'filename')

writefis(fismat,'filename','dialog')

说明writefis将一个MATLAB工作空间FIS结构fismat用一个.fis文件形式保存到磁盘上;

writefis(fismat)产生一个对话框让用户输入文件的名称和存放文件的目录;

writefis(fismat,'filename')将对应于FIS结构fismat的一个.fis文件写到一个称为filename.fis的磁盘文件中,不使用对话框该文件被保存在当前目录中;

writefis(fismat,'filename','dialog')创建一个带有提供的缺省名为filename.fis的对话框;

若扩展名不存在,则只为filename添加.fis扩展名。

例6-34

>>a=newfis('tipper');

>>a=addvar(a,'input','service',[010]);

>>a=addmf(a,'input',1,'poor','gaussmf',[1.50]);

>>a=addmf(a,'input',1,'good','gaussmf',[1.55]);

>>a=addmf(a,'input',1,'excellent','gaussmf',[1.510]);

>>writefis(a,'my_file')

结果为

ans=

my_file

6.2.20显示FIS的规则

函数showrule

格式showrule(fis)

showrule(fis,indexList)

showrule(fis,indexList,format)

showrule(fis,indexList,format,Lang)

说明此命令用于显示与给定系统相关的规则。

fis是必须提供的变量,这是一个FIS结构在MATLAB工作空间中的变量名;

indexList是你要显示的规则向量(可选项);

format是一个表示返回规则格式的字符串(可选项),showrule可以用三种不同格式的任意一种返回规则:'verbose'(缺省模式,此处English是缺省语言),'symbolic'和'indexed',它们用于隶属度函数的索引引用;

若要使用第四个参数Lang,则Lang必须是verbose(语言)型的,并且下面这种调用showrule(fis,indexList,format,Lang)使用Lang给定的语言显示规则,它们必须是'english','francais'或'deutsch'。

例6-35

>>a=readfis('tipper');

>>showrule(a,1)

ans=

1.If(serviceispoor)or(foodisrancid)then(tipischeap)(1)

>>showrule(a,2)

ans=

2.If(serviceisgood)then(tipisaverage)(1)

>>showrule(a,[31],'symbolic')

ans=

3.(service==excellent)|(food==delicious)=>(tip=generous)(1)

1.(service==poor)|(food==rancid)=>(tip=cheap)(1)

>>showrule(a,1:3,'indexed')

ans=

11,1(1):2

20,2(1):1

32,3(1):2

6.2.21显示FIS结构的所有属性

函数showfis

格式showfis(fismat)

说明以分行方式显示MATLAB工作空间FIS变量fismat,允许你查看结构的每个域的意义和内容。

例6-36

>>a=readfis('tipper');

>>showfis(a)

结果为

Nametipper

Typemamdani

Inputs/Outputs[21]

NumInputMFs[32]

NumOutputMFs3

NumRules3

AndMethodmin

OrMethodmax

ImpMethodmin

AggMethodmax

DefuzzMethodcentroid

InLabelsservice

food

OutLabelstip

InRange[010]

[010]

OutRange[030]

InMFLabelspoor

good

excellent

rancid

delicious

OutMFLabelscheap

average

25.generous

InMFTypesgaussmf

gaussmf

gaussmf

trapmf

30.trapmf

31.OutMFTypestrimf

32.trimf

33.trimf

InMFParams[1.5000]

[1.5500]

36.[1.51000]

[0013]

[791010]

OutMFParams[05100]

[1015200]

[2025300]

RuleAntecedent[11]

[20]

[32]

RuleConsequent1

2

3

RuleWeigth1

1

1

RuleConnection2

1

 

你可能感兴趣的:(MATLAB,matlab,Fuzzy)