函數 fuzzy
格式 fuzzy %彈出未定義的基本FIS編輯器
fuzzy(fismat) %使用fuzzy('tipper'),彈出下圖FIS編輯器。
編輯器是任意模糊推理系統的高層顯示,它允許你調用各種其它的編輯器來對其操作。此界面允許你方便地訪問所有其它的編輯器,並以最靈活的方式與模糊系統進行交互。
方框圖:窗口上方的方框圖顯示了輸入、輸出和它們中間的模糊規則處理器。單擊任意一個變量框,使選中的方框成爲當前變量,此時它變成紅色高亮方框。雙擊任意一個變量,彈出隸屬度函數編輯器,雙擊模糊規則編輯器,彈出規則編輯器。
圖6-19
菜單項:FIS編輯器的菜單棒允許你打開相應的工具,打開並保存系統。
·File菜單包括:
New mamdani FIS … 打開新mamdani型系統;
New Sugeno FIS … 打開新Sugeno型系統;
Open from disk … 從磁盤上打開指定的.fis文件系統;
Save to disk 保存當前系統到磁盤上的一個.fis文件上;
Save to disk as … 重命名方式保存當前系統到磁盤上;
Open from workspace … 從工作空間中指定的FIS結構變量裝入一個系統;
Save to workspace … 保存系統到工作空間中當前命名的FIS結構變量中;
Save to workspace as … 保存系統到工作空間中指定的FIS結構變量中;
Close windows 關閉GUI;
·Edit菜單包括:
Add input 增加另一個輸入到當前系統中;
Add output 增加另一個輸出到當前系統中;
Remove variable 刪除一個所選的變量;
Undo 恢復當前最近的改變;
·View 菜單包括:
Edit MFs … 調用隸屬度函數編輯器;
Edit rules … 調用規則編輯器;
Edit anfis … 只對單輸出Sugeno型系統調用編輯器;
View rules … 調用規則觀察器;
View surface … 調用曲面觀察器。
彈出式菜單:用五個彈出式菜單來改變模糊蘊含過程中五個基本步驟的功能:
·And method:爲一個定製操作選擇min、prod或Custom;
·Or method:爲一個定製操作選擇max、probor(概率)或Custom;
·Implication method:爲一個定製操作選擇min、prod或Custom;此項對Sugeno型模糊系統不可用。
·Aggregation method:爲一個定製操作選擇max、sum、probor或Custom。此項對Sugeno型模糊系統不可用。
·Defuzzification method:對Mamdani型推理,爲一個定製操作選擇centroid(面積中心法)、bisector(面積平分法)、mom(平均最大隸屬度法)、som(最大隸屬度最小值法)、lom(最大隸屬度最大值法)或Custom。對Sugeno型推理,在wtaver(加權平均)或wtsum(加權和)之間選擇。
6.1.15 隸屬函數編輯器
函數 mfedit
格式 mfedit('a')
mfedit(a)
mfedit
說明 mfedit('a')生成一個隸屬函數編輯器,他允許你檢查和修改存儲在文件a.fis中FIS結構的所有隸屬函數。如圖,mfedit('tank')以這種方式打開隸屬函數編輯器並裝入tank.fis中存儲的所有隸屬函數。
mfedit(a)對於FIS結構操作一個MATLAB工作空間變量a。Mfedit可單獨彈出沒有裝入FIS的隸屬函數編輯器
圖6-20
菜單項:在ANFIS編輯器GUI上,有一個菜單棒允許你打開相關的GUI工具、打開和保存系統等。File菜單與FIS編輯器上的File菜單功能相同。
·Edit菜單項包括:
Add MF… 爲當前語言變量增加隸屬度函數;
Add custom MF… 爲當前語言變量增加定製的隸屬度函數;
Remove current MF 刪除當前的隸屬度函數;
Remove all MFS 刪除當前語言變量的所有隸屬度函數;
Undo 恢復當前最近的改變。
·View菜單項包括:
Edit FIS properties… 調用FIS編輯器;
Edit rules… 調用規則編輯器;
View rules… 調用規則觀察器;
View surface… 調用曲面觀察器。
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)-5 rand(10,1)];
>>numMFs = [3 7];
>>mfType = str2mat('pimf','trimf');
>>fismat = genfis1(data,numMFs,mfType);
>> [x,mf] = plotmf(fismat,'input',1);
>>subplot(2,1,1), plot(x,mf);
>>xlabel('input 1 (pimf)');
>>[x,mf] = plotmf(fismat,'input',2);
>>subplot(2,1,2), plot(x,mf);
>>xlabel('input 2 (trimf)');
結果爲圖6-21。
圖6-21
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.5 0.25 0.3])
這裏假定組合的維數是3。假設Xin有兩維、Xout有一維,那麼,0.5和0.25是Xin數據維中每一維的作用範圍,0.3是Xout數據維的作用範圍。
fismat = genfis2(Xin,Xout,0.5,[-10 -5 0; 10 5 20])
這裏指定了如何將Xin和Xout中的數據規範化爲[0 1]區間中的值來進行處理。假設Xin有兩維、Xout有一維,那麼Xin第一列中的數據是從[-10 +10]比例變換後的值,Xin第二列中的數據是從[-5 +5]比例變換後的值,Xout中的數據是從[0 20]比例變換後的值。
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-22。
圖6-22
6.2.4 將mamdan型FIS轉換爲Sugeno FIS
函數 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([2 1; 4 9],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);
圖6-23
|
>>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-23。
6.2.7 模糊均值和減法聚類
函數 findcluster
格式 findcluster
findcluster('file.dat')
說明 findcluster產生一個GUI上的Method下的下拉式標籤,可以實現模糊C均值(fcm)或模糊減法聚類(subtractiv),使用Load Data按鈕輸入數據,剛進入GUI時,對每種方法的選項都設置爲缺省值。
此工具使用多維數據集,但只顯示這些維數中的兩維。使用X-axis和Y-axis下的下拉式標籤選擇你想觀察的數據維。例如你有一個五維數據集,按照出現在數據集中的順序,此工具將數據標記爲data_1,data_2,data_3,data_4,data_5, Start將完成聚類,Save Centre將保存聚類中心。
當使用數據集file.data時,findcluster(file.dat)自動裝入數據集,並且只繪製數據集中的前兩維。產生GUI後,你仍可以選擇要聚類數據的那兩維。
例6-24
>>findcluster('clusterdemo.dat')
結果爲圖6-24。
6.2.8 繪製一個FIS
函數 plotfis
格式 plotfis(fismat)
說明 此函數顯示由fismat指定的一個FIS的高層方框圖,輸入和它們的隸屬函數出現在結構特徵圖的左邊,同時輸出和它們的隸屬函數出現在結構特徵圖的右邊。
例6-25
>>a = readfis('tipper');
>>plotfis(a)
結果爲圖6-25。
圖6-24 圖6-25
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-26。
圖6-26
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',[0 100]);
>>a = addmf(a,'input',1,'cold','trimf',[0 30 60]);
>>getfis(a,'input',1)
返回結果
Name = temperature
NumMFs = 1
MFLabels =
cold
Range = [0 100]
ans =
[ ]
>>b = rmmf(a,'input',1,'mf',1);
>>getfis(b,'input',1)
返回
Name = temperature
NumMFs = 0
MFLabels =
Range = [0 100]
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',[0 100]);
>>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