QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18880|回复: 5
打印 上一主题 下一主题

神经网络在R语言 实现

[复制链接]
字体大小: 正常 放大
haviet        

2

主题

4

听众

60

积分

升级  57.89%

  • TA的每日心情
    开心
    2014-6-23 23:18
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    跳转到指定楼层
    1#
    发表于 2011-9-13 20:25 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    ti<-proc.time()
    ! r3 [; @  E1 j4 U% r8 ABP_one_output<-function(input,output,m,fth,sth,w,v){
    7 n0 p  n9 I7 E5 A) _* w, r) |4 ?+ g        x<-input;#7*8+ u/ ^6 j0 V" m0 ?
            y<-output;#8*1,y为向量,每一元素为一个样本输出值
      |" b' b# u& [# K0 i! z        theta<-fth;#11*1
    ( t; ~5 V% Z6 V, r# M        gama<-sth;#标量' H; h; Z" t' f5 u* p+ a, l! _  ^
            if(m!=length(theta)) print("阈值长度错误!")
    8 k9 g7 G% f# G. q' }        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重+ d! u% o1 ^/ q" ^: Y
            K<-nrow(x);#8一组样本的维数
    - v/ }+ Y8 a+ x7 S        J<-ncol(x);#8一共有多少组样本
    " h6 H% _( x1 ~. X/ S        w<-rbind(w,t(theta));#由7*11变为8*11' M# C( j4 A* a* S# Z
            v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    7 q8 s# W& |- n( i: V# i#定义函数f9 U. k( N5 N* e" `) `. g4 b1 J
            f<-function(h) 1/(1+exp(-h));+ K; Z5 n9 `- x+ ^9 H
            epsilon<-alpha<-0.5;5 C) A, i1 T9 F+ S# T, i
            N<-0;#重复学习次数的计数
    8 p: g  ~# i8 q$ `2 j" v        ei<-as.numeric();#记录每次迭代的平均残差平方和
    ( {9 B7 b, R* r! c, J        FW<-1;
    " w. _$ u- a# k' N9 m        while((FW/J)>=0.001){
    - K, @& F& ?2 c" C% f$ E% ]                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本; {- g* h$ L* ?, _
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    ; i" M+ m/ P/ O$ x+ X2 {( K1 C                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns2 z* L4 ~. {- v
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值0 t& Y% H1 i! u6 m" d7 c8 _
                    D<-f(Z2);#向量,每一元素为一组样本的一个输出值) N5 y  o9 @. @+ O; t
                    b<-y-D;
    / t  s, x+ |- X+ L                #J组样本的学习
    . i# P$ i8 m: F+ b. ^( E                #向量,输出层对隐含层的权值的偏导
    % H3 B; }7 |. n" u                FW<-pFW2<-pFW2t_1<-0;' S* i' D7 D6 M6 w/ s8 M
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导. P8 e6 T  e; m4 k  ]
                    for(t in 1:J){
    ; m. ]/ N! n4 }4 z% ^; n& w- G                        B3<-b[t];3 Q3 P# m9 o" J8 ?3 t2 a7 \
                            FW<-FW+B3*B3;#标量0 i" Z! e- E: Q7 k" g
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量% f  Z' \) c9 M+ W) G2 Y  E
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项$ e5 M  }9 o" g# A. H
                            if(t==1) v<-v-0.5*epsilon*pFW2) M# r, w) y$ C  B
                            else{) ]- o/ H' {* o9 Q' }! j8 R2 F- u
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    8 g0 O, w* f% O. @                                pFW2t_1<-pFW2;
    9 ^2 D) p! P+ [! F! A( [                        }
    - H5 Q, @1 l1 f* E3 h                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连1 T3 c3 k; }+ y9 s' Q+ Q
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导" w2 `! a3 ~/ `. p) I0 J% o8 A
                            if(t==1) w<-w-0.5*epsilon*pFW1+ I1 s4 N, N" `% x
                            else{$ N: ?9 X* @4 r' g9 ~* `. }9 N4 v
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);  i) s# m. q; f% N: @5 X( M  c
                                    pFW1t_1<-pFW1;: A! P# e: B: M* r
                            }# Y$ _" z7 J1 Z! y% ]
                    }5 S+ L, t, ~# S! R. D8 s
                    N<-N+1;0 D7 v/ s7 d. Q8 Y( h  R
                    ei[N]<-FW/J;# r9 @& F6 ~& z' K4 u% Y7 M* V( |
            }
    8 c; U/ Z8 k2 }8 w; x, `2 p3 w- N        theta<-w[nrow(w),];#隐含层阈值% V8 u  w8 V3 N
            gama<-v[length(v)];#输出层阈值
    3 {9 F4 f! I" Q        w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    + j4 C( X' m$ w. F        v<-v[1length(v)-1)];#隐含层对输出层的权重
    9 L' M: @8 y3 o        list(theta,gama,w,v,N,FW/J,ei)/ `; H+ z2 [7 f- ^8 H% b
    }
    . ?' g" }7 G) [5 m- J  p: h* [% {* ?x<-cbind(x1,x2,x3,x4,x5,x6,x7);+ z3 Q* S( X2 i
    x<-t(x);& z% Q  X$ B' m8 P$ G! }
    hidden_threshold<-runif(11);2 F6 U4 l$ S. C7 A* u- Q! G; ]- B  G
    output_threshold<-runif(1);8 [$ S* A# B5 R6 C
    w<-matrix(runif(77),7,11);
    , y, `" t9 t( u8 C$ W; n1 @3 g5 W( H) dv<-runif(11);
    , J9 ?3 F8 Z, `result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    / T3 L1 d+ b6 D0 p: O4 b  [. X5 S#输出
    6 q& [' Z5 [# @( y' jcat("\n");
    7 Y' X) ]1 i& T6 ^. c& O, Wcat("隐含层阈值theta","\n",result[[1]],"\n");' a! Q; [% R8 d& p4 q
    cat("输出层阈值gama","\n",result[[2]],"\n");
    7 p5 n+ `. v. k3 M# N# V  N$ Fw<-as.matrix(result[[3]],7,11);
    2 g1 X8 h5 g8 c" H5 }" g4 fcat("输入层对隐含层的权重w","\n");
    7 |8 f* I/ g+ g4 C; Ow;
    5 r. i7 }; r# n4 [' [cat("\n");* b% W* {" G# x: P
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");- M* W' f7 U- S$ a
    cat("迭代次数N" ,"\n",result[[5]],"\n");1 M. g  S, L/ G4 z8 J, P
    cat("学习误差FW","\n",result[[6]],"\n");
    ) J9 S& P$ r  t7 I7 [6 W: E& Y  z( l5 `cat("每次迭代的误差","\n");: f. ]2 M6 M3 }4 p  y; |- i1 ^7 Y
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");% j4 ^9 n% ?! {  e
    proc.time()-ti2 k, W3 b+ Y. Y+ d
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    0

    主题

    4

    听众

    50

    积分

    升级  47.37%

    该用户从未签到

    回复

    使用道具 举报

    Esmtih        

    0

    主题

    4

    听众

    9

    积分

    升级  4.21%

  • TA的每日心情
    难过
    2011-11-8 08:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    回复

    使用道具 举报

    黄窗帘        

    0

    主题

    4

    听众

    28

    积分

    升级  24.21%

    该用户从未签到

    回复

    使用道具 举报

    凌chers        

    0

    主题

    4

    听众

    34

    积分

    升级  30.53%

  • TA的每日心情

    2012-8-30 18:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    群组学术交流A

    回复

    使用道具 举报

    2

    主题

    9

    听众

    52

    积分

    升级  49.47%

  • TA的每日心情
    开心
    2016-6-22 08:37
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    自我介绍
    多次国赛获奖,研究生数学建模获得国家奖

    社区QQ达人

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-26 03:10 , Processed in 0.475840 second(s), 80 queries .

    回顶部