数学建模社区-数学中国

标题: 神经网络在R语言 实现 [打印本页]

作者: haviet    时间: 2011-9-13 20:25
标题: 神经网络在R语言 实现
ti<-proc.time()8 C4 e) X# p4 y* B/ f+ e
BP_one_output<-function(input,output,m,fth,sth,w,v){
  |" p, e! P1 r# U        x<-input;#7*8
6 B, D% _/ ]2 E. f9 [        y<-output;#8*1,y为向量,每一元素为一个样本输出值
- D5 g. G4 g* C1 o, b        theta<-fth;#11*16 D0 B# r; j" r! p- ^! _
        gama<-sth;#标量
, l0 y8 @5 L% V9 A5 E; T        if(m!=length(theta)) print("阈值长度错误!")2 w# Y! X9 B3 W# f1 }( `
        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
$ R- n3 A6 f. d5 ?0 w        K<-nrow(x);#8一组样本的维数
( i6 t) C. ?8 M: o" O* L  `% e/ {        J<-ncol(x);#8一共有多少组样本
* A  T' {( i6 W# K* F8 T4 g. @: x        w<-rbind(w,t(theta));#由7*11变为8*11
" r% p, G. a4 V* {        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接1 W' C9 j- w3 u2 _' C" d0 W
#定义函数f
9 D: x# M9 E1 ?, Y4 g' ?! u1 s        f<-function(h) 1/(1+exp(-h));& b  U) p' q" n& u
        epsilon<-alpha<-0.5;5 [: |" K0 K2 ~: P  N
        N<-0;#重复学习次数的计数5 w6 ?  O$ l3 b. }
        ei<-as.numeric();#记录每次迭代的平均残差平方和5 _7 F& d0 x9 t+ z% G
        FW<-1;
% o0 w* M- K) C; y        while((FW/J)>=0.001){  s7 F5 M) o. y8 m( Q
                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本4 A( w1 K' @+ k
                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
3 P6 E" f9 d1 P                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns% P0 x1 X; I0 G3 O0 L
                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值) g4 O% M5 Y* a1 `
                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
0 k. K# X4 N  {                b<-y-D;" u6 j8 d9 P5 B0 l+ H
                #J组样本的学习
. ^' w0 w. _# g                #向量,输出层对隐含层的权值的偏导. K; R; u1 @  I  J
                FW<-pFW2<-pFW2t_1<-0;5 A! F; q$ l. `" q  e/ V
                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导% P: Z2 r3 U' b- l& `1 G- Z* f( E# q
                for(t in 1:J){3 P1 ?9 X% x3 z4 s
                        B3<-b[t];
6 U2 q2 {- O4 O9 Y8 A( `                        FW<-FW+B3*B3;#标量
( L7 F6 y; S4 G                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
2 B  G, X6 j% C                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
) C; B8 s; E9 _: F5 ^                        if(t==1) v<-v-0.5*epsilon*pFW2! p  _' o4 I/ `
                        else{
) r- G% O( x; M/ G+ l                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
' w* a) X" l7 v8 w" @( u4 I+ ^* {                                pFW2t_1<-pFW2;
- _; j' ^  H' c! I* ~                        }
0 g5 Z! U, g* m+ H! N0 ?; R6 f# C                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
2 i% t. u+ o3 d0 O                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
) s# g# K2 @; s/ |* K+ E# s                        if(t==1) w<-w-0.5*epsilon*pFW1$ q, u9 _  r& r% e: q
                        else{
- }: W- O8 |7 v) K0 g( K9 d: r$ {                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);3 \# Y4 p+ o3 d8 P; B
                                pFW1t_1<-pFW1;
4 Y# v7 n8 `4 J/ ]- [; g                        }
& M0 ]$ l+ o+ j' a" {$ M6 J                }3 d5 ~2 K% R/ I' _
                N<-N+1;) U& d! a" Y: r, _: z# ]* l6 b6 O
                ei[N]<-FW/J;3 k8 s& {  E  a% K' z  R/ S
        }9 y+ J* T  d% `3 B: L
        theta<-w[nrow(w),];#隐含层阈值( _5 {2 q& M5 E/ n0 h, O* ]3 I
        gama<-v[length(v)];#输出层阈值
, o6 M# X1 O- T        w<-w[1nrow(w)-1),];#输入层对隐含层的权重
$ A8 E7 P# b3 x' \) w! l" _        v<-v[1length(v)-1)];#隐含层对输出层的权重& P; M% d  I# c
        list(theta,gama,w,v,N,FW/J,ei)7 |' r0 v. h9 N9 J
}
  s, y  y3 |1 K" L  u* vx<-cbind(x1,x2,x3,x4,x5,x6,x7);0 k0 }  Z4 T6 ?) C) s' v
x<-t(x);
/ a8 }' `. m! C& G: n0 b3 ohidden_threshold<-runif(11);
4 D5 D3 X. j6 K4 z6 T; Y+ t3 Y$ foutput_threshold<-runif(1);: ?- ?% D/ o% A# U
w<-matrix(runif(77),7,11);: o2 U4 O& C( \: [( j; v
v<-runif(11);
) Y5 ?( W0 D) b9 ?# Y) a: r6 {result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
4 E$ i9 E* L" A& @. G6 @, X& V6 y; t" f#输出, y/ F" B# H. t+ v" x. ^/ `) u3 v9 a
cat("\n");
" b' k$ R5 b6 R9 [cat("隐含层阈值theta","\n",result[[1]],"\n");
! `- }1 d. f; j7 H8 s8 ?( O* h4 Qcat("输出层阈值gama","\n",result[[2]],"\n");3 T: c5 B# f, |/ V( j6 G; i
w<-as.matrix(result[[3]],7,11);3 b1 P3 {$ _" p" k) {
cat("输入层对隐含层的权重w","\n");
+ q  Z3 q, i8 l$ E8 q6 M. t' Z: [* \w;3 B% p5 s$ Z/ ~
cat("\n");! y9 S/ y9 r5 e- i
cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
( M& d6 ]2 p. l2 V5 k# S  b* S' ncat("迭代次数N" ,"\n",result[[5]],"\n");% m1 ^/ T7 p9 j% _  w8 s  u, C
cat("学习误差FW","\n",result[[6]],"\n");
) _( c1 s: M$ i, ~6 V; D) Bcat("每次迭代的误差","\n");
1 q9 W# o- \9 a; n- i3 ]7 \/ D1 ^plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");/ H9 f+ P7 O9 C5 A  T" A  }" c
proc.time()-ti; w) ?. l3 u, y* G! g- B

作者: 廷植斌_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