ANN神經網路入門-分類問題
---------------寫-在-前-面---------------本篇推文的水仙花分類程序參考自博客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
轉載或引用請註明來源
--------------------------------------------------
正文
1、Fishr集上鳶尾花Iris數據集的分類iris數據集簡介
iris數據集的中文名是安德森鳶尾花卉數據集,英文全稱是Anderson』s Iris data set。iris包含150個樣本,對應數據集的每行數據。每行數據包含每個樣本的四個特徵和樣本的類別信息,所以iris數據集是一個150行5列的二維表。
通俗地說,iris數據集是用來給花做分類的數據集,每個樣本包含了花萼長度、花萼寬度、花瓣長度、花瓣寬度四個特徵(前4列),我們需要建立一個分類器,分類器可以通過樣本的四個特徵來判斷樣本屬於山鳶尾、變色鳶尾還是維吉尼亞鳶尾(這三個名詞都是花的品種)。
iris的每個樣本都包含了品種信息,即目標屬性(第5列,也叫target或label)。
樣本局部截圖:
MATLAB中可運行命令load iris.dat將數據集載入到工作區,部分數據集如圖所示。數據集的前四列分別為與鳶尾花種類相關的4個特徵值,對應上圖中的花萼長度、花萼寬度、花瓣長度及花瓣寬度;第五列為鳶尾花所屬種類,分為1-Setosa、2-Versicolour、3-Virginica三類。
數據預處理
這裡的神經網路屬於監督學習的模式,因此需要從上述數據集中分離出訓練集和測試集,我們分別記為trainData和testData。我們從iris數據集中選取2/3數據作為訓練集trainData,選取1/3數據作為測試集testData,並分別將其保存至trainData.txt和testData.txt文件,用於程序的數據導入源(兩個文件均已上傳至源代碼)。
分類源程序
[MATLAB]
%讀取訓練數據
clear
clc
load 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.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,作為程序的數據導入源文件(兩個文件均已上傳至源代碼)。
分類源程序
[MATLAB]
%讀取訓練數據
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.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次左右僅稍微達到收斂,這可能是由於訓練集樣本規模太小導致的。
TAG:LeoHao |