作者:魯偉
一個數據科學踐行者的學習日記。數據挖掘與機器學習,R與Python,理論與實踐並行。個人公眾號:數據科學家養成記 (微信ID:louwill12)
引子
一直在琢磨怎樣把這些看起來高大上的數據挖掘和機器學習算法給大家用稍微通俗點的語言介紹出來,後來又覺得這要取決於我自己對算法的理解程度有多深以及會不會以一個傳道授業解惑的角度來看待自己,所以就儘量做到自己的推文能讓人看起來更友好一點。
人工神經網絡(Artificial Neural Network)簡單而言是一種分類算法。作為機器學習的一個龐大分支,人工神經網絡目前大約有幾百種算法,其中包括一些著名的ANN算法:感知器神經網絡(Perceptron Neural Network), 反向傳遞(Back Propagation), Hopfield網絡和自組織映射(Self-Organizing Map, SOM)等等,這篇文章我們只介紹最基本的人工神經網絡算法原理及其簡易的R語言實現方式。
在前幾期的推文中,我們介紹的樸素貝葉斯和貝葉斯網絡算法就是一種分類算法,先給兩個例子讓大家對分類這個概念有直觀的認識。
· 是否拖欠銀行貸款:銀行根據一個人有房與否,婚姻狀況和年收入來 判斷客戶是否會拖欠貸款。
· 垃圾郵件分類:機器會根據郵件裡面的詞彙來判斷一封郵件是否為垃圾郵件。
如果一個機器能對輸入的內容進行分類的話這個機器就稱為分類器。分類器的輸入是一個數值向量,叫做屬性或者特徵。在是否拖欠銀行貸款的例子中,我們的輸入是有房(1)無房(0)、已婚(1)未婚(0)收入區間這樣的一個向量;垃圾郵件分類中我們的輸入向量是一些0/1值,表示每一個單詞是否出現。分類器的輸出也是數值,拖欠貸款輸出為1,不拖欠輸出為0;垃圾郵件輸出為1,非垃圾郵件輸出為0。
分類器的目的就是要使正確分類的可能性儘可能的高,錯分的概率儘可能的低,一般我們會人為的劃分一些樣本做好標記作為訓練樣本,訓練好的樣本拿來對測試樣本進行檢驗,這就是一個分類算法的基本原理。人工神經網絡作為一種分類算法,其背後的原理大抵如此,因訓練樣本中要有標記,所以人工神經網絡是一種監督分類算法。
神經網絡簡介
人工神經網絡是在現代神經科學的基礎上提出和發展起來的一種旨在反映人腦結構及功能的抽象數學模型。它具有人腦功能基本特性:學習、記憶和歸納。
除去輸入層和輸出層之外,一般神經網絡還具有隱藏層,隱藏層介於輸入層和輸出層之間,這些層完全用於分析,其函數聯繫輸入層變量和輸出層變量,使其更好地擬合訓練樣本。隱藏層的功能主要是增加ANN的複雜性,使算法能夠模擬更為複雜的非線性關係,但隱藏層過多會導致過度擬合的問題。
神經網絡的基本原理:(編輯器不方便輸入公式,只好從word裡截圖放上來。另f(x)為傳遞函數。)
簡單神經網絡的拓撲結構如圖所示:
神經網絡的訓練:
人工神經網絡在進行學習前,必須建立一個訓練樣本使ANN在學習過程有一個參考,訓練樣本的建立來自於實際系統輸入與輸出或是以往的經驗。舉個簡單的例子:
洗衣機洗淨衣服的時間與衣服的衣料、數量和骯髒程度等因素有關,因此我們必須針對不同的衣料、數量和骯髒程度統計出洗衣所需時間,建立一個訓練樣本,不同衣服的衣料、數量和骯髒程度就是ANN的輸入,而洗衣所需時間則為ANN的目標值,即輸出。
ANN的學習就是不斷調整權重的過程:
1) 通過輸入節點將輸入變量加以標準化,標準化後的變量數值落在0和1之間,或者-1到1之間。
2) 將網絡權重的初始值設定為0(或隨機產生),通過各節點的函數來估計數據的目標變量值。
3) 比較實際值和估計值之間的誤差,並根據誤差值重新調整各權重的偏置。
4) 反覆執行步驟2,一直到實際值和估計值之間的誤差最小,此時停止學習以獲得最佳權重。
ANN常用傳遞(激活)函數包括線性函數、階梯函數、Sigmoid函數、分段線性函數以及高斯函數和雙曲正切函數等,具體函數類型可自行查找。一些傳遞函數如圖所示:
簡單而言,含有隱藏層的神經網絡使得我們能夠處理較為複雜的分類問題。
人工神經網絡的簡單R語言實現
R語言中已經有多個關於神經網絡的學習包,包括nnet、AMORE、neuralnet和RSSNS包,nnet提供了最常見的前饋反向傳播神經網絡算法。AMORE包則更進一步提供了更為豐富的控制參數,並可以增加多個隱藏層。neuralnet包的改進在於提供了彈性反向傳播算法和更多的激活函數形式,而RSNNS包則擴充了其它拓撲結構和網絡模型。
我們使用數據挖掘導論一書中的簡單數據例子,利用AMORE包來實現簡單的BP神經網絡。數據如圖所示:
對該數據集進行神經網絡的訓練,代碼如下:
library(AMORE) #加載AMORE包
x1=c(1,1,1,1,0,0,0,0)
x2=c(0,0,1,1,0,1,1,0)
x3=c(0,1,0,1,1,0,1,0)
y=c(-1,1,1,1,-1,-1,1,-1)#導入數據
p<-cbind(x1,x2,x3)
target=y#設定輸入層和輸出層
net <- newff(n.neurons=c(3,1,1),
learning.rate.global=1e-2,momentum.global=0.4,
error.criterium="LMS",Stao=NA,hidden.layer="tansig",
output.layer="purelin",method="ADAPTgdwm")
#指定3個輸入點,隱藏層和輸出層節點數各為1,隱藏層傳遞函數為tansig,輸出層傳遞函數為purelin,收斂判據為最小平方法,這樣一個BP神經網絡模型就構建起來了。
result <- train(net,p,target,error.criterium="LMS",
report=TRUE,show.step=100,n.shows=5)#對構建好的模型進行樣訓練
a<-sim(result$net,p)#查看結果
對比輸出的a值和數據中的y值,可見神經網絡的建模結果與實際完全符合。
結語
這些看似高深莫測的算法,背後的數學原理實則並不嚇人,當然了,神經網絡是一個博大精深的算法群,現在熱門的深度學習其實就是神經網絡的一種拓展,要想在機器學習和人工智慧領域有所突破,深究這些算法的基本原理和編程實現方式是必不可少的。
微信回復關鍵字即可學習
回復 R R語言快速入門免費視頻
回復 統計 統計方法及其在R中的實現
回復 用戶畫像 民生銀行客戶畫像搭建與應用
回復 大數據 大數據系列免費視頻教程
回復 可視化 利用R語言做數據可視化
回復 數據挖掘 數據挖掘算法原理解釋與應用
回復 機器學習 R&Python機器學習入門