matlab 神經網絡ann用於分類方法

matlab關於ann的分類方法講解了一個例子,Fishr集上鳶尾花(Iris)的分類,學習了這個方法可以套用在個人項目上使用,萬變不離其宗,

1、Fishr集上鳶尾花Iris數據集的分類
①iris數據集簡介
iris數據集的中文名是安德森鳶尾花卉數據集,英文全稱是Anderson’s Iris data set。iris包含150個樣本,對應數據集的每行數據。每行數據包含每個樣本的四個特徵和樣本的類別信息,所以iris數據集是一個150行5列的二維表。
通俗地說,iris數據集是用來給花做分類的數據集,每個樣本包含了花萼長度、花萼寬度、花瓣長度、花瓣寬度四個特徵(前4列),我們需要建立一個分類器,分類器可以通過樣本的四個特徵來判斷樣本屬於山鳶尾、變色鳶尾還是維吉尼亞鳶尾(這三個名詞都是花的品種)。
iris的每個樣本都包含了品種信息,即目標屬性(第5列,也叫target或label)。

樣本局部截圖:

load iris.dat

 將數據集載入到工作區,部分數據集如圖所示。數據集的前四列分別爲與鳶尾花種類相關的4個特徵值,對應上圖中的花萼長度、花萼寬度、花瓣長度及花瓣寬度;第五列爲鳶尾花所屬種類,分爲1-Setosa、2-Versicolour、3-Virginica三類。

②數據預處理
這裏的神經網絡屬於監督學習的模式,因此需要從上述數據集中分離出訓練集和測試集,我們分別記爲trainData和testData。我們從iris數據集中選取2/3數據作爲訓練集trainData,選取1/3數據作爲測試集testData,並分別將其保存至trainData.txt和testData.txt文件,用於程序的數據導入源,方法見另外一個博客(https://blog.csdn.net/qingfengxd1/article/details/105931988

③分類源程序

%讀取訓練數據
clear
clc
%------本代碼採用ANN對鳶尾花進行分類,程序運行前,請準備好#鳶尾花樣本#的訓練集和測試集(可在MATLAB中載入iris.dat查看數據)-----
%f1 f2 f3 f4是四個特徵值
[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);
%特徵值歸一化
[input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]')  ;
%構造輸出矩陣
s = length( class) ;
output = zeros( s , 3  ) ;
for i = 1 : s 
   output( i , class( i )  ) = 1 ;
end
%創建神經網絡
net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ; 
%{
    minmax(input):獲取4個輸入信號(存儲在f1 f2 f3 f4中)的最大值和最小值;
    [10,3]:表示使用2層網絡,第一層網絡節點數爲10,第二層網絡節點數爲3;
    { 'logsig' 'purelin' }:
        表示每一層相應神經元的激活函數;
        即:第一層神經元的激活函數爲logsig(線性函數),第二層爲purelin(對數S形轉移函數)
    'traingdx':表示學習規則採用的學習方法爲traingdx(梯度下降自適應學習率訓練函數)
%}
%設置訓練參數
net.trainparam.show = 50 ;% 顯示中間結果的週期
net.trainparam.epochs = 500 ;%最大迭代次數(學習次數)
net.trainparam.goal = 0.01 ;%神經網絡訓練的目標誤差
net.trainParam.lr = 0.01 ;%學習速率(Learning rate)
%開始訓練
%其中input爲訓練集的輸入信號,對應output爲訓練集的輸出結果
net = train( net, input , output' ) ;
%================================訓練完成====================================%
%=============================接下來進行測試=================================%
 
%讀取測試數據
[t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);
 
%測試數據歸一化
testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ;
%[testInput,minI,maxI] = premnmx( [t1 , t2 , t3 , t4 ]')  ;
%仿真
%其中net爲訓練後得到的網絡,返回的Y爲
Y = sim( net , testInput ) 
 
%統計識別正確率
[s1 , s2] = size( Y ) ;
hitNum = 0 ;
for i = 1 : s2
    [m , Index] = max( Y( : ,  i ) ) ;
    if( Index  == c(i)   ) 
        hitNum = hitNum + 1 ; 
    end
end
sprintf('識別率是 %3.3f%%',100 * hitNum / s2 )

④代碼的相關說明
A. 語句net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ;用於創建神經網絡,其參數含義和用法如下:

    (1)minmax(input):獲取4個輸入信號(存儲在f1 f2 f3 f4中)的最大值和最小值;
    (2) [10,3]:表示使用2層網絡,第一層網絡節點數爲10,第二層網絡節點數爲3。其中最後一層的網絡包含的節點數一定要與網絡的理論輸出個數保持一致,例如本例中鳶尾花的種類數爲3,因此最後一層的網絡節點數爲3;
    (3){ 'logsig' 'purelin' }:表示每一層相應神經元的激活函數,即:第一層神經元的激活函數爲logsig(線性函數),第二層爲purelin(對數S形轉移函數),其他激活函數和用法請參見神經網絡與深度學習之激活函數;
    (4) 'traingdx':表示學習規則採用的學習方法爲traingdx(梯度下降自適應學習率訓練函數)。常見的訓練函數(學習方法)有:

  traingd :梯度下降BP訓練函數(Gradient descent backpropagation)
  traingdx :梯度下降自適應學習率訓練函數

    (5)創建的神經網絡用MATLAB神經網絡工具箱顯示如圖,圖中更形象的展示了構造的神經網絡模型。

B. 關於正確率的統計算法的說明

第一次看到這裏的正確率統計算法時,我自己是不大明白的,之後又從網上搜了一些資料並查閱了MATLAB的幫助文檔,才明白代碼的含義。

語句net = train( net, input , output' ) ;是對網絡進行訓練,該語句明確了網絡的輸出爲output,通過對output矩陣的構造方式分析,我們可知網絡的輸出可以看成3個,我們不妨即爲C1、C2、C3,分別代表鳶尾花的三個種類,例如:

(1)當output的某一行爲1 0 0,則說明該花屬於C1類

(2)當output的某一行爲0 1 0,則說明該花屬於C2類

(3)當output的某一行爲0 1 0,則說明該花屬於C3類

語句Y = sim( net , testInput ) 是對訓練後的網絡net進行仿真測試,測試用的數據爲testInput;這裏,Y返回的是網絡訓練後對測試輸入的預測值,例如:

(1)當Y的某一行爲1.0220  -0.0020  -0.0091,代表輸出結果C1=1.0220, 輸出結果C2=-0.0020,C3=-0.0091

(2)當Y的某一行爲-0.0108  0.9884  -0.0216,代表輸出結果C1=-0.0108,輸出結果C2=0.9884,C3=-0.0216

輸出結果中只包含一個1和兩個0是理想情況下的結果,在進行仿真時,分類輸出往往達不到這樣的結果,但我們可以根據哪個結果對應的值與1的接近程度來進行判斷,例如仿真結果(1)說明該花極有可能屬於C1類,仿真結果(2)說明該花極有可能屬於C2類。

*從以上描述中我們可以明白神經網絡算法也可以應用於具體數值的預測,且應用廣泛。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章