1. 程式人生 > >Matlab 中繪製模糊隸屬度函式

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