数学建模社区-数学中国

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

作者: haviet    时间: 2011-9-13 20:25
标题: 神经网络在R语言 实现
ti<-proc.time()
4 [  e% h$ Q0 W5 xBP_one_output<-function(input,output,m,fth,sth,w,v){
) d. h  H: _# H0 h& G; `, O        x<-input;#7*86 g' u% S3 o- B9 T9 u4 i' r
        y<-output;#8*1,y为向量,每一元素为一个样本输出值
. A! l; h# ^$ c- l, g$ S        theta<-fth;#11*1
" i7 r( U6 q/ ]        gama<-sth;#标量
6 o7 e' G  O% z        if(m!=length(theta)) print("阈值长度错误!")8 F/ s: E2 ^) |
        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
  ~4 `" Q5 k2 n        K<-nrow(x);#8一组样本的维数
2 g$ D# i5 m7 |        J<-ncol(x);#8一共有多少组样本
6 P+ U8 d6 ~6 ?' W! `" {+ j        w<-rbind(w,t(theta));#由7*11变为8*11
; [8 |# A9 _; t' Y/ {" X        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接3 K  {- w6 B) Z- ~
#定义函数f  h( Q1 j8 R& W: y3 j# Q
        f<-function(h) 1/(1+exp(-h));$ {! D- Q: b6 p9 h" _
        epsilon<-alpha<-0.5;% m8 |5 d2 v7 ?9 o3 l( u0 v
        N<-0;#重复学习次数的计数! e7 D6 e8 u$ k
        ei<-as.numeric();#记录每次迭代的平均残差平方和
5 g+ @# \0 _$ \. W6 p3 Y" n        FW<-1;
! V, C! }, [: g8 O0 W+ ^        while((FW/J)>=0.001){/ [) k% q6 b* k9 o$ l6 ~) v/ |! q$ `5 c2 Z
                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本6 q+ ]- E( F2 J- m: d( M6 b  @
                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
# c! ^9 ~  d6 s5 R                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns
/ S* ]. u( Q7 L8 l3 O9 x                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值( v# M# w1 `1 f& }/ C0 _
                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
' e* W2 y+ S; f# U3 D" X! A) p                b<-y-D;
  T0 [1 j# b3 N' _; k                #J组样本的学习
/ z  ~$ s4 T& W' {0 L                #向量,输出层对隐含层的权值的偏导( t6 k1 J4 f9 ?: O$ O8 S
                FW<-pFW2<-pFW2t_1<-0;
5 e2 j; k3 I6 v% q5 Q8 K                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
) K" z& U8 I8 p3 U                for(t in 1:J){! H- m/ f$ d/ B3 g7 S+ I
                        B3<-b[t];
( D9 u9 o; E( C, a, \0 e" [9 q                        FW<-FW+B3*B3;#标量5 h7 w8 E, i6 a5 v6 X
                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量9 V8 l2 u+ x% j. E( K
                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
( ~# p% P6 l! U5 I3 h; @, Q7 O8 I) f                        if(t==1) v<-v-0.5*epsilon*pFW2, c5 K8 L5 f7 N5 A( x- o8 t- |! \
                        else{
, u7 ?) e  \% t* K2 N" ?( z* C2 w                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
" k: D8 Y, \# z, S  [                                pFW2t_1<-pFW2;
: a8 q& ?2 n0 P                        }# B( D5 m9 @4 j1 b6 R
                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
2 M  C6 A3 f- i; d2 l8 {                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导' s. C/ S) p. h$ U( a
                        if(t==1) w<-w-0.5*epsilon*pFW15 j1 w; I) t6 D' N$ F3 W
                        else{/ x: P+ N; R, ^9 W; @. W
                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
) k5 l9 p7 [  t( ]$ t                                pFW1t_1<-pFW1;
8 z: G  r2 K- ~2 @' E7 p" K8 D4 M  z                        }' d  k" |1 j  L( i% e* x1 h) ?/ }
                }6 H  @1 p: ~- P: c7 E
                N<-N+1;
9 f7 `2 R. Z7 V% I: {( ~                ei[N]<-FW/J;" Z' u+ \; q2 c$ F4 ]
        }
( z) ~( D# c( E, G        theta<-w[nrow(w),];#隐含层阈值
* s3 q4 O& z/ x        gama<-v[length(v)];#输出层阈值
/ I# N" l' ^$ g2 k' z, F7 a; k        w<-w[1nrow(w)-1),];#输入层对隐含层的权重6 R& N+ }- L8 A7 s5 r1 I$ d
        v<-v[1length(v)-1)];#隐含层对输出层的权重# ]- K( Y% E% [9 R  J; A* I
        list(theta,gama,w,v,N,FW/J,ei)# f9 x/ k# k" Y5 u4 G
}
# _6 i( H% u& V4 c! N# ~0 u/ dx<-cbind(x1,x2,x3,x4,x5,x6,x7);
5 g" ]/ T; m* `7 E( @x<-t(x);
/ X8 @9 L, l, r5 T5 d3 {2 ohidden_threshold<-runif(11);1 m* U' u. o6 ^! r) g! H
output_threshold<-runif(1);% B; N5 z( f$ x  q2 ]0 u. N
w<-matrix(runif(77),7,11);3 b* N6 E; _8 ?, S% Z6 e5 q0 ?- F1 E$ U% n
v<-runif(11);
6 z) E, c( t" P4 D, h9 l  K. |result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);* a( L# W9 @( L7 S3 l/ _9 O/ L2 D
#输出
! p  n( S+ G$ {+ O, ycat("\n");
, N" ~. X0 l; O7 Gcat("隐含层阈值theta","\n",result[[1]],"\n");- v& d' n$ u! \* X" k$ A
cat("输出层阈值gama","\n",result[[2]],"\n");& N- z5 z3 m; d" z. Q
w<-as.matrix(result[[3]],7,11);4 B7 m- o, O& e8 M  {% s* W8 u) N
cat("输入层对隐含层的权重w","\n");2 h0 O4 R5 C' x  s; O( A  t
w;
' A2 K" Q, w3 A( a: @cat("\n");
* \1 ~( Q; ?8 ^7 Zcat("隐含层对输出层的权重v","\n",result[[4]],"\n");
# [/ x& G' d5 w0 F7 gcat("迭代次数N" ,"\n",result[[5]],"\n");
, G+ X: n" F4 i+ M$ ^& l! L! \) Icat("学习误差FW","\n",result[[6]],"\n");
! R  h) |0 ~9 i7 Ncat("每次迭代的误差","\n");. e7 d+ [. W: e6 y8 H* T: q; I( a
plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");) t! e# M) j. A' W6 L
proc.time()-ti; |3 G. f+ C' a- Z* M0 S* Z/ }" v6 _

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