数学建模社区-数学中国
标题:
神经网络在R语言 实现
[打印本页]
作者:
haviet
时间:
2011-9-13 20:25
标题:
神经网络在R语言 实现
ti<-proc.time()
1 W1 h; P6 }/ d8 {% {
BP_one_output<-function(input,output,m,fth,sth,w,v){
0 R5 F% p8 x5 |/ J' c) Q0 C- Y l
x<-input;#7*8
# q9 p* w+ n/ Q' u
y<-output;#8*1,y为向量,每一元素为一个样本输出值
) |* R( `5 ]! }0 L0 i% y1 X/ y
theta<-fth;#11*1
# ?( O8 E; [1 ~+ C
gama<-sth;#标量
. L o+ a. H5 Q( ]2 g8 [! O
if(m!=length(theta)) print("阈值长度错误!")
; [8 k4 g" ~6 y; C. L- t
x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
- x6 w; w" H/ Q6 t8 A. n3 T' c
K<-nrow(x);#8一组样本的维数
! J. @1 p- O* h% D
J<-ncol(x);#8一共有多少组样本
+ o, N0 E! N" y
w<-rbind(w,t(theta));#由7*11变为8*11
$ \% ?( A+ O3 q2 D# P
v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
1 C: g* r; y: `( [ P
#定义函数f
& I: x/ E; F g, S8 n9 i' ]
f<-function(h) 1/(1+exp(-h));
( A, P% r" t$ }2 y
epsilon<-alpha<-0.5;
9 k+ R+ \# h# S. _
N<-0;#重复学习次数的计数
7 U) r. r+ ~! R! r6 T {
ei<-as.numeric();#记录每次迭代的平均残差平方和
& S8 l/ K. T& G
FW<-1;
9 I- [8 k7 i4 Y/ E
while((FW/J)>=0.001){
+ p" X7 T) O3 p1 G9 a5 i
Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
! ~3 I; k1 l" R
Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
* j) i, H' o) ?9 ^6 o0 Q/ t
#2 indicates columns, c(1, 2) indicates rows and columns
/ z2 X) u' r9 T+ ^/ R! \3 t
Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
' d0 R+ u% m1 O" r3 `
D<-f(Z2);#向量,每一元素为一组样本的一个输出值
& [7 S* i X+ t7 F" P ^" b
b<-y-D;
; ?% V, z: I( u v
#J组样本的学习
. Z0 ]& L% V% l' S. b
#向量,输出层对隐含层的权值的偏导
1 `3 E1 G# d# |0 x+ U* M, C
FW<-pFW2<-pFW2t_1<-0;
8 z7 c, n' ^1 `: s4 V: O
pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
# w6 A1 P' q% Z( w# ]
for(t in 1:J){
2 x# Q6 ?6 j- ]" a
B3<-b[t];
- ~' w1 z% C2 ?% I4 a- a
FW<-FW+B3*B3;#标量
4 `4 r8 }: n8 N h, h" f5 c+ H
B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
0 ~! Y, J2 ?4 D( R1 \! \* X
pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
, K3 i8 D% h& n
if(t==1) v<-v-0.5*epsilon*pFW2
+ R0 b- d+ M% |3 u6 Z' C
else{
2 C8 W" Y M8 L) J
v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
0 c2 q$ X3 d( R5 g4 P Q; g9 v
pFW2t_1<-pFW2;
& a, t& r& g8 e# H. z/ f" \
}
* e1 P* c/ ]- r- H9 ^* P- \
B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1
length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
: i# \5 ]- G! M& C& r
pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
3 z" i$ R7 r* h @' D
if(t==1) w<-w-0.5*epsilon*pFW1
3 g9 ]4 @9 x- b
else{
: G8 h& \/ R2 W
w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
+ H7 U$ a" @$ ~
pFW1t_1<-pFW1;
8 X6 v- g2 J! l* Z2 |+ i, e' u
}
" o, D, O2 y4 u7 V3 n' J
}
$ N. ?/ t |% ]9 I0 M6 x
N<-N+1;
1 Q8 [# B) @ t2 _
ei[N]<-FW/J;
& F# {$ }/ @) }6 e
}
; q# L4 s! S) S3 T( O' z
theta<-w[nrow(w),];#隐含层阈值
( M9 K; e8 c# }9 K
gama<-v[length(v)];#输出层阈值
. d, S& i- d* O! W5 y3 p
w<-w[1
nrow(w)-1),];#输入层对隐含层的权重
; [( r/ T/ o" J" V& ?
v<-v[1
length(v)-1)];#隐含层对输出层的权重
: g8 Q0 n% S* h4 N
list(theta,gama,w,v,N,FW/J,ei)
1 x8 U; A' ]' @) |+ Y8 P- {9 o
}
4 @. T9 \- E! l% `+ j A' |, T
x<-cbind(x1,x2,x3,x4,x5,x6,x7);
( `$ B/ H; h- w" [- [+ G. ^
x<-t(x);
* k) t1 O. M8 N# W
hidden_threshold<-runif(11);
$ x, g) X& S$ f( B" k5 z
output_threshold<-runif(1);
3 M+ c1 s2 [" o* h2 X
w<-matrix(runif(77),7,11);
9 O5 z* ^! H, o2 ?4 O
v<-runif(11);
. ?3 j! r( O7 x, S8 h* t
result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
, ~# O4 q" b. y
#输出
$ r5 [+ R) H9 h2 ^- y% z+ C
cat("\n");
& X+ G" y, c+ U9 h
cat("隐含层阈值theta","\n",result[[1]],"\n");
! E8 s8 k/ U+ J) w5 v, n
cat("输出层阈值gama","\n",result[[2]],"\n");
$ T# S) | G2 O/ m& ~: p0 b
w<-as.matrix(result[[3]],7,11);
8 n* N' u* J& ~) ^, H) c2 C1 B
cat("输入层对隐含层的权重w","\n");
$ a' a7 E' u' ]' m) B
w;
) V: N% f0 C3 v7 w% m1 k9 x
cat("\n");
# ?, v6 ~) _+ o2 C7 D. y+ C5 d0 M
cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
4 d+ T) ?+ X: }0 A$ M* U
cat("迭代次数N" ,"\n",result[[5]],"\n");
$ @( r7 g& |2 L w
cat("学习误差FW","\n",result[[6]],"\n");
% b- o+ W4 m& X Y( z7 q- r. a& }
cat("每次迭代的误差","\n");
; B) M& M/ K8 }
plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
2 A. i+ p3 m7 K- v2 A
proc.time()-ti
- \$ v8 {% M5 S; K" N( F
作者:
廷植斌_972
时间:
2011-10-30 23:44
支持~~顶顶~~~
作者:
Esmtih
时间:
2011-11-8 09:26
运行不了啊?
作者:
黄窗帘
时间:
2012-2-1 14:07
就看看,不说话。
作者:
凌chers
时间:
2012-3-22 15:08
能不能解释一下呢?
作者:
兰竹李乐
时间:
2014-9-2 12:51
这牛逼的你自己编的吗
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5