SHEN

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40584718/article/details/80626471

神经网络的实现

神经网络的原理(后补),可以查阅张铃教授的相关文章。以下主要讲的是前馈神经网络在R中的实现,目前主要有nnet,neuralnet,AMORE等包,以下以AMORE为例。

公式:
x m i n ( x ) ( m a x ( x ) m i n ( x ) )

还原:
m i n ( x ) + X ( m a x ( x ) m i n ( x ) )

  • 归一化函数premnmx,
premnmx<-function(x){
    X<-c()
    max=apply(x,2,max)
    min<-apply(x,2,min)
    for(i in 1:nrow(x)){
        X<-rbind(X,(x[i,]-min)/(max-min))}
    AA<-list(max=max,min=min,X=X)
    return(AA)}
  • 去归一化函数postmnmx
postmnmx<-function(x,max,min)
{   X<-c()
    for(i in 1:nrow(x)){
    X=rbind(X,x[i,]*(max-min)+min)}
return(X)}
  • 预测数据格式化pnew_premnmx
pnew_premnmx<-function(x,max,min){
    X<-c()
    for(i in 1:nrow(x)){
    X=rbind(X,(x[i,]-min)/(max-min))}
return(X)}

读取数据,并进行归一化处理

Car<-file.choose()
Car<-read.csv(Car,header=TRUE)
#训练数据集P
P<-Car[,2:4]
#目标值Target
Target<-Car[,5:6]
#做归一化处理
#归一化训练数据集p
p<-premnmx(P)
#归一化目标数据值target
target<-premnmx(Target)

加载并训练模型

  • 加载神经网络包
library(AMORE)
net<-newff(n.neurons = c(1,3,2,8,3,2),learning.rate.global = 0.005,momentum.global=0.05,error.criterium = "LMS",    
           hidden.layer = "tansig",output.layer = "purelin",method = "ADAPTgdwm",Stao = NA)
#输入层三个结点,隐藏层8个结点,输出层2个结点,学习率0.035,误差标准LMS
result=train(net,p$X,target$X,error.criterium = "LMS",report = TRUE,show.step = 3000,n.shows = 5)
y1<-sim(result$net,p$X)

预测数据

  • 预测数据集
Pnew<-matrix(c(73.59,3.9,0.98,75.55,4.1,1.02),ncol=3,byrow=TRUE)
  • 归一化
pnew<-pnew_premnmx(Pnew,p$max,p$min)
  • 仿真
y2<-sim(result$net,pnew)
  • 预测数据去格式化
Y2<-postmnmx(y2,target$max,target$min)

预测曲线

神经网络拟合和预测曲线

par(mar=c(5,3,4,5))
par(mfrow=c(1,2))
plot(Car[,1],target$X[,1],col="red",type="b",pch="*",xlim=c(1990,2015),ylim=c(0,1.5),lwd=1.5)
points(Car[,1],y1[,1],col="green",pch="+")
points(c(2010,2011),y2[,1],pch="x",col='blue',cex=0.8)
lines(c(Car[-1,1],2010,2011),c(y1[-1,1],y2[,1]),col="blue",type="b",pch="x",lwd=1.5,cex=0.8)
legend(1990,1.2,pch=c("*","+","x"),col=c("red","green","blue"),legend=c("初始拟合","训练拟合","新数据预测"))
title("pop_traffic" )
plot(Car[,1],target$X[,2],col="red",type="b",pch="*",xlim=c(1990,2012),ylim=c(0,1.5))
points(Car[,1],y1[,2],col="green",pch="+")
points(c(2010,2011),y2[,2],pch="x",col='blue',cex=0.8)
lines(c(Car[-1,1],2010,2011),c(y1[-1,2],y2[,2]),col="blue",type="b",pch="x",lwd=1.5,cex=0.8)
legend(1990,1.2,pch=c("*","+","x"),col=c("red","green","blue"),legend=c("初始拟合","训练拟合","新数据预测"))
title("car_traffic" )

b

回归模型

model1<-lm(pop_trafic~pop+car+square,data=Car)
model2<-lm(th_traffic~pop+car+square,data=Car)
colnames(Pnew)<-c("pop","car","square")
Y11<-predict(model1,as.data.frame(Pnew))
Y22<-predict(model2,as.data.frame(Pnew))
Y<-matrix(0,ncol=2,nrow=2)
Y[,1:2]<-c(Y11,Y22)

结果比较

1神经网络/2回归 Time pop_traffic car_traffic
1 2010 53902.65 28797.78
1 2011 55222.35 29566.71
2 2010 55081.91 29002.62
2 2011 56506.83 30169.88

猜你喜欢

转载自blog.csdn.net/qq_40584718/article/details/80626471