R神經網絡代碼 (對數據有歸一化和反歸一化)

nnet包實現神經網絡

看了下網上很多R實現的神經網絡都是調用包直接做模型,對於神經網絡用來預測的代碼根本沒有進行歸一化和反歸一化的求解,在我直接研究了R的scale函數原理後,我先用它對數據歸一化,他的反歸一化自己寫代碼實現,R這個功能的實現沒有matlab裏面方面,在matlab裏面直接可以調用mapminmax實現歸一化和反歸一化,導致大家用R做神經網絡的時候都是直接做,網絡訓練時候誤差下降梯度慢,很久不收斂,模型泛化能力差,下面是我的代碼,如果有錯還請你指出。

讀入數據如下:
這裏寫圖片描述

Load.Forecast這個是輸入指標,Final.Price這個是輸出指標,用他們構建神經網絡,預測後面一部分數據,具體代碼如下:



install.packages('nnet')  #裝載包
rm( list = ls ( all = TRUE))  #清楚所有變量

library('nnet') 

df = read.csv("D://matlabyewu//BP.csv") #讀入數據
colnames(df)
norm.df=scale(df[,c(2:3)])

trainingData=norm.df[1:(length(df[,1])-48),]
testingData=norm.df[(length(df[,1])-47):length(df[,1]),]


model1=nnet(Final.Price ~Load.Forecast,data=trainingData, size=10,  decay=0.05, maxit=2000 ,linout = T, trace = F)  #建立模型 
summary(model1)             

x<-as.data.frame(trainingData[,1])
names(x)<-c('Load.Forecast')

norm.preds<- predict(model1, x)    
trainresult= cbind(norm.preds,trainingData[,2])      #預測結果 

nmse2 <- mean((norm.preds-scale(trainingData[,2]))^2)/mean((mean( scale(trainingData[,2]))- scale(trainingData[,2]))^2)
nmse2#計算出相對誤差
preds=norm.preds*sd(df[1:(length(df[,1])-48),2])+mean(df[1:(length(df[,1])-48),2])#還原標準化的數據
preds
wc =(preds-df[1:(length(df[,1])-48),2])/df[1:(length(df[,1])-48),2]*100#計算出誤差

xtest<-as.data.frame(testingData[,2])
names(xtest)<-c('Load.Forecast')
nnt<- predict( model1, xtest) #預測測試集   


compareTable <- cbind(testingData[,2], nnt)  # comparison table

View(compareTable)#觀察預測結果

nmsetest <- mean((nnt-scale(testingData[,2]))^2)/mean((mean( scale(testingData[,2]))- scale(testingData[,2]))^2)
nmsetest#計算出相對誤差

testdf=  df[(length(df[,1])-47):length(df[,1]),]
predstest=nnt*sd(testdf[,3])+mean(testdf[,3])#還原標準化的數據
predstest
testresult<- cbind(testdf[,3],predstest)  # comparison table
wc1 =(predstest-testdf[,3])/testdf[,3]*100#計算出誤差
testwc_result=data.frame(testresult,wc1)  #實際值,預測值和相對誤差
write.csv(testwc_result,file="D://matlabyewu//BP//R500//testwc_result.csv")#寫出數據
#結果可視化
y1=testresult[,1]
y2=testresult[,2]
b=c(1:length(y1))
plot(b,y1,ylim=c(min(y1,y2),max(y1,y2)),col='red',type="l",ylab="y")
lines(b,y2,col='green')
legend("topleft", legend=c("實際值","預測值"),lty=1,col=c("red","green"))

網上也有類似的代碼 ,只是他們預測數據的時候把期望值也當成輸入指標了,導致結果不正確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章