寫在前面
本篇博客的鳶尾花分類程序來源於博客http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html
在上述博客中,作者主要介紹了以下三部分內容:
(1)神經網絡基本原理
(2)AForge.NET實現前向神經網絡的方法
(3)Matlab實現前向神經網絡的方法
該博客對神經網絡算法的入門和理解有很大的幫助,本博客主要給出神經網絡算法的兩個簡單應用,分別是Fishr集上鳶尾花(Iris)的分類以及常見的分類問題-蠓蟲分類,同時通過對兩個分類程序(Code by MATLAB)進一步分析,加強對神經網絡算法的理解。
--------------------------------------------------------------------------------------------
*本篇博客用到的所有程序和源文件下載請見以下鏈接:https://pan.baidu.com/s/1ggYS3gn 密碼:tepb
*鏈接失效請發郵件至 [email protected]
*轉載或引用請註明來源
--------------------------------------------------------------------------------------------
一、正文
1、Fishr集上鳶尾花Iris數據集的分類
①iris數據集簡介
iris數據集的中文名是安德森鳶尾花卉數據集,英文全稱是Anderson’s Iris data set。iris包含150個樣本,對應數據集的每行數據。每行數據包含每個樣本的四個特徵和樣本的類別信息,所以iris數據集是一個150行5列的二維表。
通俗地說,iris數據集是用來給花做分類的數據集,每個樣本包含了花萼長度、花萼寬度、花瓣長度、花瓣寬度四個特徵(前4列),我們需要建立一個分類器,分類器可以通過樣本的四個特徵來判斷樣本屬於山鳶尾、變色鳶尾還是維吉尼亞鳶尾(這三個名詞都是花的品種)。
iris的每個樣本都包含了品種信息,即目標屬性(第5列,也叫target或label)。樣本局部截圖:
MATLAB中可運行命令
將數據集載入到工作區,部分數據集如圖所示。數據集的前四列分別爲與鳶尾花種類相關的4個特徵值,對應上圖中的花萼長度、花萼寬度、花瓣長度及花瓣寬度;第五列爲鳶尾花所屬種類,分爲1-Setosa、2-Versicolour、3-Virginica三類。load iris.dat
②數據預處理
這裏的神經網絡屬於監督學習的模式,因此需要從上述數據集中分離出訓練集和測試集,我們分別記爲trainData和testData。我們從iris數據集中選取2/3數據作爲訓練集trainData,選取1/3數據作爲測試集testData,並分別將其保存至trainData.txt和testData.txt文件,用於程序的數據導入源(兩個文件均已上傳至源代碼)。
③分類源程序
%讀取訓練數據 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類。
*從以上描述中我們可以明白神經網絡算法也可以應用於具體數值的預測,且應用廣泛。
⑤仿真和運行結果
說明:以上程序的識別率穩定在96%左右,訓練150次左右達到收斂,訓練曲線如上圖所示:
2、蠓蟲分類
①背景介紹
生物學家WLGrogan和WWWirth發現,蠓蟲的種類與它們的觸角長度和翼長有關,且蠓蟲大致分爲兩類,記爲Apf和Af。
現有如下樣本,下面需要通過神經網絡模型找到一種有效的對蠓蟲分類的方法。
②數據預處理
與鳶尾花分類類似,我們隨機選取2/3作爲訓練集trainData,1/3作爲測試集testData,考慮到這是一個分類問題,因此我們將目標值0.9替換爲2,代表蠓蟲屬於Apf類;將目標值0.1替換爲1,代表蠓蟲屬於Af類,處理後導入至文本文件trainData.txt和testData.txt,作爲程序的數據導入源文件(兩個文件均已上傳至源代碼)。
③分類源程序
%讀取訓練數據 clear clc %f1 f2 f3 f4是四個特徵值 [f1,f2,class] = textread('trainData.txt' , '%f%f%f'); %特徵值歸一化 [input,minI,maxI] = premnmx( [f1 , f2 ]') ; %構造輸出矩陣 s = length( class) ; output = zeros( s , 2 ) ; for i = 1 : s output( i , class( i ) ) = 1 ; end output %創建神經網絡 net = newff( minmax(input) , [10 2] , { 'logsig' 'purelin' } , '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 c] = textread('testData.txt' , '%f%f%f'); %測試數據歸一化 testInput = tramnmx ( [t1,t2]' , minI, maxI ) ; %[testInput,minI,maxI] = premnmx( [t1 , t2]') ; %仿真 %其中net爲訓練後得到的網絡,返回的Y爲 Y = sim( net , testInput ) %{ Y返回預測值,輸出有兩個記爲A、B,理想情況下輸出爲上述的output,輸出結果只有1和0兩種 即:output = 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 --------------------------------------------------------------------------------- 例:Y = 0.1432 0.4841 1.0754 1.2807 0.8405 0.6034 0.5329 0.1427 -0.4194 0.0947 則說明: 對於第一個測試數據,輸出結果A=0.1432,輸出結果B=0.6034 對於第一個測試數據,輸出結果A=0.4841,輸出結果B=0.5329 因此,對於本例:若結果A更接近於1(左接近或右接近),那麼說明該測試數據屬於第一個分類; 若結果B更接近於1(左接近或右接近),那麼說明該測試數據屬於第二個分類。 因此,ANN除了應用於分類問題,也可應用於對具體數值的預測問題。 --------------------------------------------------------------------------------- _______________________________________________________________2018.02.06 by_LeoHao %} %統計識別正確率 [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 )
④神經網絡可視化
創建的神經網絡用MATLAB神經網絡工具箱顯示如圖,圖中更形象的展示了構造的神經網絡模型。
⑤仿真和運行結果
*說明:從上圖來看,識別率近似於100%,訓練在120次左右僅稍微達到收斂,這可能是由於訓練集樣本規模太小導致的。