R語言數據挖掘實踐——用R語言實現神經網絡

機器學習 R語言 人工智能 數學 數據分析和挖掘 數據分析和挖掘 2017-09-07

R語言數據挖掘實踐——用R語言實現神經網絡

神經網絡概述

人工神經網絡是一種應用類似於大腦神經突觸連接的結構進行信息處理的數學模型。在工程學與學術界也常將其直接簡稱為神經網絡或類神經網絡。

神經網絡是一種運算模型,由大量的節點(或稱神經元)和之間的相互連接構成。它是一種非程序化、適應性、大腦風格的信息處理。其本質是通過網絡的變換和動力學行為得到一種並行分佈式的信息處理功能,並在不同程度和層次上模仿人腦神經系統的信息處理功能。它是設計神經科學、思維科學、人工智能、計算機科學等多個領域的交叉學科。

神經網絡是計算智能和機器學習的重要分支,在諸多領域都取得了很大的成功。

神經網絡近年來越來越受到人們的關注,因為它為解決大複雜度問題提供了一種相對比較有效的簡單方法。神經網絡可以很容易地解決具有上百個參數的問題。

神經網絡通常是一種基於數學統計學類型的學習方法,所以神經網絡也是數學統計學方法的一種實際應用,通過統計學的標準數學方法使我們能夠得到大量的可以用函數來表達的局部結構空間。另一方面,在人工智能學的人工感知領域,我們通過數學統計學的應用可以解決人工感知方面的決定問題(也就是說,通過統計學的方法,神經網絡能夠類似人一樣具有簡單的決定能力和簡單的判斷能力),這種方法比起正式的邏輯學推理演算更具有優勢。在人工神經網絡中,神經元處理單元可表示不同的對象,例如特徵、字母、概念,或者一些有意義的抽象模式。神經元的連接權值反映了單元間的連接強度,信息的表示和處理體現在網絡處理單元的連接關係中。

神經網絡是一種運算模型,由大量的節點(或稱神經元)和之間的相互連接構成,每個節點代表一種特定的輸出函數,稱為激勵函數(activation function)。每兩個節點間的連接都代表一個對於通過該連接信號的加權值,稱之為權重,這相當於人工神經網絡的記憶。網絡的輸出則依網絡的連接方式、權重值和激勵函數的不同而不同。而網絡自身通常都是對自然界某種算法或者函數的逼近,也可能是對一種邏輯策略的表達。

現今神經網絡常用於兩類問題:分類和迴歸。

在使用神經網絡時有幾點需要注意:

  1. 神經網絡很難解釋,目前還沒有能對神經網絡做出顯而易見解釋的方法學;

  2. 神經網絡會學習過度,在訓練神經網絡時一定要恰當地使用一些能嚴格衡量神經網絡的方法,如測試集方法、交叉驗證法等。這主要是由於神經網絡太靈活、可變參數太多;

  3. 除非問題非常簡單,訓練一個神經網絡可能需要相當可觀的時間才能完成。當然,一旦神經網絡建立好了,用它做測試時運行還是很快的。

神經網絡在R語言中的實現

R語言中的nnet軟件包是用來建立單隱藏層的人工神經網絡模型,同時也能用來建立多項對數線性模型。在使用之前,先下載安裝相應的軟件包,並加載後即可使用。

>install.packages("nnet")

>library("nnet")

nnet包中主要有4個函數,分別為:class.ind()、multinom()、nnet()和nnetHess()。其中multinom()函數是用來建立多項多數模型的,這裡不做過多介紹。

class.ind()函數

class.ind()函數用於對數據進行預處理,這也正是該函數最重要及唯一的一項功能。更具體地說,該函數是用來對建模數據中的結果變量進行處理的(即對模型中的y進行處理)。該函數對結果變量的處理,其實是通過結果變量的因子變量來生成一個類指標矩陣。該函數的基本使用格式如下:

class.ind(cl)

這個函數的使用非常簡單,函數中只有一個參數,該參數可以是一個因子向量,也可以是一個類別向量。簡而言之,cl可以直接是我們需要進行預處理的結果變量。為了更好地介紹該函數的功能,我們首先假設兩個需要進行預處理的結果向量“一個是字符類別(a,b,a,c);另一個為數量類別(1,2,1,3)。下面我們通過展示在R語言中對於上述兩個向量的具體處理過程及結果,讓大家更清楚地瞭解該函數。

> #生成字符向量vector1

> vector1 <- c("a","b","a","c")

> #生成數量向量vector2

> vector2 <- c(1,2,1,3)

> #對字符向量vector1進行預處理

> class.ind(vector1)

a b c

[1,] 1 0 0

[2,] 0 1 0

[3,] 1 0 0

[4,] 0 0 1

> #對數量向量vector2進行預處理

> class.ind(vector2)

1 2 3

[1,] 1 0 0

[2,] 0 1 0

[3,] 1 0 0

[4,] 0 0 1

從輸出結果中可以看到,該函數主要是將向量變成一個矩陣,其中每行還是代表一個樣本。只是將樣本的類別用0和1來表示,即如果是該類,則在該類別名下用1表示,而其他類別名下面用0表示。

nnet()函數

nnet()函數是實現神經網絡的核心函數,它主要用來建立單隱藏層的前饋人工神經網絡模型,同時也可以用該函數建立無隱藏層的前饋人工神經網絡模型。

nnet()函數的具體使用格式有兩種形式,下面分別具體介紹該函數的兩種使用方式。

第一類函數的使用格式為:

nnet(formula, data, weights, ..., subset, na.action, contrasts = NULL)

其中,

  • formula代表的是函數模型的形式;

  • data代表的是在模型中包含的有變量的一組可選格式數據;

  • weights代表的是各類樣本在模型中所佔比重,該參數的默認值為1,即各類樣本按原始比例建立模型;

  • subset主要用於抽取樣本數據中的部分樣本作為訓練集,該參數所使用的數據格式為向量,向量中的每個數代表所需要抽取樣本的行數。

第二類函數的使用格式為:

nnet(x, y, weights, size, Wts, mask, linout=FALSE, entropy=FALSE, softmax=FALSE,censored=FALSE,

skip=FALSE,rang=0.7, decay=0, maxit=100,Hess=FALSE, trace=TRUE, MaxNWts=1000,abstol=1.0e-4,

reltol=1.0e-8, ...)

其中,

  • x為一個矩陣或者一個格式化的數據集,該參數就是在建立人工神經網絡模型中所需要的自變量數據;

  • y是在建立人工神經網絡模型中所需要的類別變量數據。但是在人工神經網絡模型中的類別變量格式與其他函數中的格式有所不同。這裡的類別變量y是一個矩陣,這個矩陣是使用class.ind()函數處理後生成的類指標矩陣。這裡的y必須使用這種格式,是硬性規定;

  • weights代表各類樣本在模型中所佔比重;

  • size代表的是隱藏層中的節點個數,該隱藏層的節點個數通常為輸入層節點個數的1.2倍至1.5倍,即自變量個數的1.2倍至1.5倍。這裡如果將參數值設定為0,則表示建立的模型為無隱藏層的人工神經網絡模型;

  • range指的是初始隨機權重的範圍是[-range,range]。通常情況下,該參數值的只有在輸入變量很大的情況下才會取到0.5左右,而一般對於確定該參數的值是存在存在一個公式的,即range與x的絕對值中最大值的成績大約等於1;

  • decay是指在模型建立過程中,模型權重值得衰減精度,即當模型的權重值每次衰減小於該參數值時,模型將不再進行迭代,該參數的默認值為0;

  • 參數maxit控制的是模型的最大迭代次數,即在模型迭代過程中,如果一直沒有觸碰模型迭代停止的其他條件,那麼模型將會在迭代達到最大次數後停止模型迭代,這個參數的設置主要為了防止模型的死循環,或者是一些沒有必要的迭代。

接下來將介紹nnet()函數的輸出結果。

  • 輸出結果wts。該結果中包含了在模型迭代過程中所尋找到的最優權重值,我們也可以將其理解為模型的最優係數;

  • 輸出結果residuals。該結果包含了訓練集的殘差值;

  • 輸出結果convergence。該結果表示在模型建立的迭代過程中,迭代次數是否達到最大迭代次數。如果結果為1,則表明迭代次數達到最大迭代次數;如果結果為0則表明沒有達到最大迭代次數。如果結果達到了最大迭代次數,我們就應該對模型的簡歷進行進一步分析,因為模型建立過程中是因為達到最大迭代次數才停止迭代的,則說明迭代過程中沒有觸碰到其他決定模型精度的條件,這就很可能會導致我們建立出來的模型精度並不高,並不是最優模型,所以應考慮是否提高最大迭代次數後再次進行模型估計。

總的來說,如果模型中的類別變量為一個含有因子的變量,則我們將建立的人工神經網絡的模型就是一個分類模型。而如果類別變量不是一個含有因子的變量,則模型將無法建立。

nnetHess()函數

該函數用來估計人工神經網絡模型中的黑塞矩陣(即二次導數矩陣)。該函數的具體使用格式為:

nnetHess(net, x, y, weights)

其中,net代表的是利用nnet()函數所建立的人工神經網絡模型;x和y則是模型中的自變量和響應變量。weights的使用方式同nnet()函數的weights使用方式一樣。

nnet軟件包中除了上述幾個函數意外,還能同predict()函數配合使用,該函數主要用於估計multinom()以及nnet()所建立模型的預測結果。

相關推薦

推薦中...