数学建模社区-数学中国

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

作者: haviet    时间: 2011-9-13 20:25
标题: 神经网络在R语言 实现
ti<-proc.time()) t, U) J4 w5 B9 a8 x0 U& Z
BP_one_output<-function(input,output,m,fth,sth,w,v){
+ v, c4 o6 q% d7 I2 i; B3 ~        x<-input;#7*8
3 b$ p& {2 J/ M" W4 {& z% d        y<-output;#8*1,y为向量,每一元素为一个样本输出值
5 ]+ c8 @6 b8 i. [5 Y& ?        theta<-fth;#11*1" v( W  R7 U, n! Q+ C" X$ H! o# u
        gama<-sth;#标量
# ^! E" a$ @* U6 s. m        if(m!=length(theta)) print("阈值长度错误!"), o% m* M( j% z7 R
        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重1 w/ A8 e7 k1 k; g+ \$ Z0 [
        K<-nrow(x);#8一组样本的维数
) k- V4 j) m6 K1 [$ o  S        J<-ncol(x);#8一共有多少组样本
0 S4 W. T3 K! V% {5 E        w<-rbind(w,t(theta));#由7*11变为8*11
  n, n0 \  r' f        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接) |7 v) @0 Y: T& v7 \
#定义函数f
: n5 s$ y! G# h( k. K# y* r6 M        f<-function(h) 1/(1+exp(-h));
* u- r7 a( U' S+ C8 w% {        epsilon<-alpha<-0.5;
3 X# ~! q1 [6 h        N<-0;#重复学习次数的计数
7 L$ {) L1 k: V6 `5 e2 _$ u        ei<-as.numeric();#记录每次迭代的平均残差平方和
/ t- |% H5 G) e        FW<-1;9 b' ]0 j: E, G6 M8 y7 {
        while((FW/J)>=0.001){
6 |6 D0 k8 h+ ?$ Z" L                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本+ C9 ~; @" L' d- V. L
                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, ) ]8 Q1 w9 _3 `+ Y( A5 K
                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns
* M/ `) D* B$ u4 P                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
0 Q" w& l4 i, q, _6 w. _: ]4 ]                D<-f(Z2);#向量,每一元素为一组样本的一个输出值6 T' B  B4 v2 w6 _! g; e
                b<-y-D;7 F9 M# J6 `: V' h6 H! w+ A0 g5 _
                #J组样本的学习. j: z/ P- p' {
                #向量,输出层对隐含层的权值的偏导, `! }0 n& a$ B4 K' q* `+ d1 `
                FW<-pFW2<-pFW2t_1<-0;! A7 t% [; a! O- P# Q3 h8 ?/ g
                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导8 B0 R3 }4 |% \7 ^
                for(t in 1:J){
, U& p- L" x$ J4 v& ]; c& D                        B3<-b[t];! C/ Y+ v0 N! ~7 f+ T" f
                        FW<-FW+B3*B3;#标量
' V- ^8 ~3 j' g# v                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
% m3 A5 ?# ?' \) G& @0 V+ k                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项6 Q5 S7 r& w: ]6 s1 \$ D% t
                        if(t==1) v<-v-0.5*epsilon*pFW2
5 Y; F; Y# V8 b# i& P# H4 ?                        else{
: o# _" W" D1 ^: E5 ^) v                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);' `4 t$ A& l& b  [" x3 P7 D
                                pFW2t_1<-pFW2;, |& x7 k8 |( j, m
                        }
  u! s6 F' B; H% U7 k                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连" X" l1 n: \5 W. k
                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导& U" |5 G7 d3 D0 Z
                        if(t==1) w<-w-0.5*epsilon*pFW13 R4 ?1 k) ?* }$ c* s! A+ \; F
                        else{
; h2 A$ I) s! Y                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
8 q& F4 ]& D2 K4 |2 H$ ~                                pFW1t_1<-pFW1;5 z2 B  }* V7 s% B9 q
                        }2 G4 `5 n0 J  n& Q8 _2 Q& |6 D9 L
                }( u* U! H" {, p5 D. \
                N<-N+1;
: ~% ]1 m( J% o  k                ei[N]<-FW/J;
2 o9 C- x1 ]. M, @        }
. g, E7 ^' ^  c# i  w1 A4 N# V        theta<-w[nrow(w),];#隐含层阈值
; Q' `: s$ w: z) u" \2 Y        gama<-v[length(v)];#输出层阈值
1 Y: S5 K% f3 S: ?$ @, e0 g1 v        w<-w[1nrow(w)-1),];#输入层对隐含层的权重
% @5 W/ ?. O: d, S: ?& @$ [        v<-v[1length(v)-1)];#隐含层对输出层的权重+ e5 n! f. K1 }6 I1 Q! M/ u
        list(theta,gama,w,v,N,FW/J,ei)- J% u3 L9 `7 K: H% \( f
}
7 S! i+ b0 Z, q, l1 gx<-cbind(x1,x2,x3,x4,x5,x6,x7);
7 O8 y2 G$ I; C' P4 c! R. T+ j7 nx<-t(x);+ q6 |# f1 P1 E
hidden_threshold<-runif(11);
5 h3 \, e8 c* B' joutput_threshold<-runif(1);3 R  q. [/ |( K+ ?1 j+ S6 i5 |
w<-matrix(runif(77),7,11);4 m0 S7 J) q- S" f; {: v7 e$ |
v<-runif(11);2 `' g/ B, n8 l* l  j. Y
result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);3 g! n5 A3 R) l5 n* H
#输出* q, L# U& G! `7 L% U! z% }
cat("\n");
/ Q2 V2 v$ d( @0 K3 q. \cat("隐含层阈值theta","\n",result[[1]],"\n");: [7 ~& |3 r7 l; }5 Y% e! R
cat("输出层阈值gama","\n",result[[2]],"\n");
3 \0 j" i- f; V4 tw<-as.matrix(result[[3]],7,11);! d9 U* X: ?7 p0 a; j" W& o
cat("输入层对隐含层的权重w","\n");0 D! ?+ \" s' t9 o
w;
8 J- n. v4 f/ E8 n$ vcat("\n");' M8 p- K9 _/ M% h
cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
+ e, b9 O' W/ r( icat("迭代次数N" ,"\n",result[[5]],"\n");- ]$ H! B& d4 X" [7 A
cat("学习误差FW","\n",result[[6]],"\n");
0 o6 F5 j3 j6 U  o1 |' _$ wcat("每次迭代的误差","\n");; I# u* ?) N1 D  c$ Y) O4 E
plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
! f4 n% h, ~$ T2 x* \. I3 e' zproc.time()-ti  H7 n& W: t% d1 t. c9 h9 I0 A! M

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