資料探勘---BP神經網路

大柚子8323發表於2021-01-04

R中關於神經網路的包:nnet、AMORE、neuralnet以及RSNNS
nnet包提供了最常見的前饋反向傳播神經網路演算法,構建單隱層神經網路;
AMORE包則進一步提供了更為豐富的控制引數,並可以增加多個隱層
neuralnet包的改進在於提供了彈性反向傳播演算法和更多的啟用函式形式。

一、構建訓練集與檢驗集

data(iris)
ind <- sample(2,nrow(iris),replace=T,prob=c(0.7,0.3)) 
trainSet <- iris[ind==1,]
testSet <- iris[ind==2,]

二、nnet包的nnet函式

nnet(traindata,trainlable,size,rang=0.1,decay=5e-4,maxit=300)
#traindata:訓練資料,注意這裡的訓練資料要去掉類標籤
#trainlable:類別
#size:隱層神經元數目
#rang:初始化權值會在-rang和rang之間選擇
#decay:權值衰減引數
#maxit:最大迭代次數
#生成類別的示性函式,把類別數值化才能計算誤差(安裝nnet包才有效)
library(nnet)
trainlable <- class.ind(trainSet$Species)
testlable <- class.ind(testSet$Species)

bpnet <- nnet(trainSet[,- 5],trainlable,size=3,rang=0.1,decay=5e-4,maxit=300)

在這裡插入圖片描述

輸入層4個神經元(4個屬性),隱層3個神經元,輸出層3個神經元(3個類)

在這裡插入圖片描述

b:偏移(每個隱層結點有一個b,每個輸出層結點有一個b)
輸入層:i1,i2,i3,i4
隱層:h1,h2,h3
輸出層:o1,o2,o3
權值

#給出訓練集分類結果
trainpre<-predict(bpnet,trainSet[,-5])
#給出檢驗集的分類結果
testpre<-predict(bpnet,newdata=testSet[,-5])
table(testSet$Species,apply(testpre,1,function(x){names(x)[which.max(x)]}))
#左邊的是行(真實類標籤),右邊是列(預測列標籤)

在這裡插入圖片描述
在這裡插入圖片描述

三、AMORE包

應用AMORE包中的三個函式實現ANN構建:
newff函式:實現構建ANN網路框架
train函式:實現網路學習過程,即權值訓練過程;
sim函式:實現網路預測,對未知樣本類別的推斷。

trainattri <- trainSet[,-5] #訓練樣本特徵資訊
trainlabel <- trainSet[,5]  #訓練樣本類別資訊
T <- class.ind(trainlabel)  #示性函式
netframe <- newff(n.neurons=c(dim(trainattri)[2],3,dim(T)[2]),# n.neurons:輸入-隱層-輸出層的神經元數目
					learning.rate.global=1e-4, #學習速率
					momentum.global=0.001, #動量因子
					error.criterium="LMS",  #誤差預測方法
					Stao=NA,  #誤差引數
					hidden.layer="sigmoid", #隱層神經元啟用函式 
					output.layer="sigmoid",  #輸出層神經元啟用函式
					method="ADAPTgdwm") #訓練方法
bpnet <- train(netframe, #由netff構建的網路(框架)
				trainattri, #訓練樣本的特徵資訊
				T, #訓練樣本的類別資訊
				error.criterium="LMS", 
				report=T,n.shows=20,show.step=500)
				#是否提供結果的圖形資訊或文字資訊
				#report=T的前提下,report的次數為20,每迭代500次報告一次(步長)
				#訓練總次數:n.shows*show.step
testattri <- testSet[,-5]
testlabel <- testSet[,5]

testPre <- sim(bpnet$net,testattri)
                #由train函式生成的訓練好權值的ANN模型,bpnet不是sim的操作物件,而是bpnet中的元素net
				#bpnet是一個list,bpnet$net即bpnet[[1]]
				#待檢測的樣本(行為樣本,列為特徵資訊)		

相關文章