R语言神经网络

---恢复内容开始---

人工神经网络:就是使用一套函数模型模拟这些相互链接的神经元。既可以对连续型目标变量做回归分析,也可以对分类型目标变量做分类分析。

神经元


神经元神经网络的基本单元,主要分为权重系数,加法器,激活函数三部分:

针对上面三个部分做说明:

带有权重系数的wj的突触,连接到输入值xj

加法器将所有的输入做加权,并与一个偏差bias求和,v=bias+sum(wj*xj)

激活函数g,把g(v)作为神经元中的输出,该函数必须是单调函数。如:阶跃函数,Logistic函数

##神经网络

##激活函数
ann.cell <- function(x,w,bias){
v <- sum(w*x)+bias
o <- 1/(1+exp(-v))
o
}
ann.core <- function(x,y,w.hidden,bias.hidden,w.out,bias.out,l){
o.hidden <- 0
for(i in 1:nrow(w.hidden)){
o.hidden[i] <- ann.cell(x,w.hidden[i,],bias.hidden[i])
}
o.out <- 0
for(i in 1:nrow(w.out)){
o.out[i] <- ann.cell(o.hidden,w.out[i],bias.out[i])
}
##输出层的错误率
error.out <- o.out*(1-o.out)*(y-o.out)
##隐藏层的错误率
error.hidden <- 0
for(j in 1:nrow(w.hidden)){
error.tmp <- sum(error.out*w.out[,j])
error.hidden[j] <- o.hidden[j]*(1-o.hidden[j])*error.tmp
}
##修正输出层的加权系数
for(i in 1:length(y)){
w.out[i,] <- w.out[i,]+l*error.out[i]*o.hidden
}
##修正隐藏层的加权系数
for(i in 1:nrow(w.hidden)){
w.hidden[i,] <- w.hidden[i,]+ l*error.hidden[i]*x
}
##修正输出层和隐藏层的偏差
bias.out <- bias.out+l*error.out
bias.hidden <- bias.hidden+l*error.hidden
out <- list(w.hidden=w.hidden,bias.hidden=bias.hidden,w.out=w.out,bias.out=bias.out)
out
}
##停止学习条件
##x,y是样本输入,必须全是矩阵,每行是一个样本
##hidden.num为隐藏层神经元数
##learn.num为学习的循环次数
ann <- function(x,y,hidden.num,learn.num){
##初始化各个神经元内的加权系数和偏差值,随机的在-0.5~0.5中选取
init <- seq(length.out=100,from=-0.5,to=0.5)
w.hidden <- matrix(sample(init,ncol(x)*hidden.num),nrow=hidden.num)
bias.hidden <- sample(init,hidden.num)
w.out <- matrix(sample(init,hidden.num*ncol(y)),nrow=ncol(y))
bias.out <- sample(init,ncol(y))
t <- ((1:learn.num)-1)%/%nrow(x)+1
k <- ((1:learn.num)-1)%/%nrow(x)+1
##使用训练集样本进行learn.nun次学习
for(i in 1:learn.num){
l <- 1/t[i]
j <- k[i]
ann.new <- ann.core(as.numeric(x[j,]),as.numeric(y[j,]),w.hidden,bias.hidden,w.out,bias.out,l)
w.hidden <- ann.new$w.hidden
bias.hidden <- ann.new$bias.hidden
w.out <- ann.new$w.out
bias.out <- ann.new$bias.out
}
out <- list(w.hidden=w.hidden,bias.hidden=bias.hidden,w.out=w.out,bias.out=bias.out)
out
}

ann.predict.core <- function(x,sol.ann){
o.hidden <- 0
for(i in 1:nrow(sol.ann$w.hidden)){
o.hidden[i] <- ann.cell(x,sol.ann$w.hidden[i,],sol.ann$bias.hidden[i])
}
o.out <- 0
for(i in 1:nrow(sol.ann$w.out)){
o.out[i] <- ann.cell(o.hidden,sol.ann$w.out[i,],sol.ann$bias.out[i])
}
o.out <- as.numeric(o.out>0.5)
o.out
}

ann.predict <- function(x,sol.ann){
y <- matrix(0,nrow=nrow(x),ncol=length(sol.ann$bias.out))
for(i in 1:nrow(x)){
y[i,] <- ann.predict.core(x[i,],sol.ann)
}
y
}

x <- iris[,1:4]
y1 <- as.numeric(iris$Species=="setosa")
y2 <- as.numeric(iris$Species=="versicolor")
y3 <- as.numeric(iris$Species=="virginica")
y <- matrix(c(y1,y2,y3),ncol=3)
ann.sol <- ann(x,y,25,20000)
ann.predict(x,ann.sol)神经元

---恢复内容结束---

posted @ 2015-11-24 16:01  Aladar  阅读(1051)  评论(0编辑  收藏  举报