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"))

网上也有类似的代码 ,只是他们预测数据的时候把期望值也当成输入指标了,导致结果不正确。

猜你喜欢

转载自blog.csdn.net/u014356002/article/details/70053429