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選單項