QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18457|回复: 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()
    . z  F$ h2 G" z8 v8 U0 fBP_one_output<-function(input,output,m,fth,sth,w,v){
    6 c, _0 R' t$ |        x<-input;#7*8
    7 a( J" Q5 M2 ?" q% k8 D1 l        y<-output;#8*1,y为向量,每一元素为一个样本输出值
    : N. l& b% B! q' x# J        theta<-fth;#11*1
    " z! R: X8 t5 J  c' i        gama<-sth;#标量$ w5 j5 _1 _1 I& q/ H& E$ i
            if(m!=length(theta)) print("阈值长度错误!")$ n9 O/ E; s: \4 u7 m
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
    9 h- d1 Q+ u' Z3 H" u        K<-nrow(x);#8一组样本的维数
    $ I/ o% D6 ^2 S3 E9 c9 y7 X        J<-ncol(x);#8一共有多少组样本$ j: j1 _( h1 z. L% e& R4 p
            w<-rbind(w,t(theta));#由7*11变为8*11& @9 }% D" T/ Z9 S
            v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    $ Y9 l1 K. X: w' a#定义函数f
    ) v7 L+ e8 v" A1 L        f<-function(h) 1/(1+exp(-h));
    # w( k1 q& L* }4 M, F        epsilon<-alpha<-0.5;+ b$ A9 X# j7 j/ k5 B1 Y0 }0 l
            N<-0;#重复学习次数的计数
    ( P1 E9 }* O" L        ei<-as.numeric();#记录每次迭代的平均残差平方和4 N0 i4 S) J( A% e  X$ M" a
            FW<-1;
    4 k( Z* `) x3 Z7 z& x6 Y' y% Y/ v        while((FW/J)>=0.001){" w" B0 P: O) K. {7 Y+ g! N- M
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
    7 V% N1 z% Z3 F7 X. ~% B                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, + ~9 o" p( a* V/ n4 l  i5 R6 b
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns4 E' R$ b7 y) A( x
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值# R  B0 }4 L/ _& H# q( Y
                    D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    ; U$ |- s5 O  q/ D. v8 J6 e3 K3 L                b<-y-D;
    6 F6 J, J6 a" W7 f1 U: ~                #J组样本的学习+ ~0 P! L7 v/ J* t# k
                    #向量,输出层对隐含层的权值的偏导2 L' @2 g1 H5 |& r  W7 @1 r/ ^4 W
                    FW<-pFW2<-pFW2t_1<-0;1 Q3 C* F: H8 H9 @2 k. X$ O5 r
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导6 z5 i  D% i9 o5 i# ^2 x; W4 c5 S
                    for(t in 1:J){
    4 E! h2 L& f5 Q6 n" \1 \                        B3<-b[t];& m/ [/ ~) ^) a. `& @2 w
                            FW<-FW+B3*B3;#标量4 K+ n) l3 X% u3 u) {& D* {2 }
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量& p- p) B3 K8 r: D1 l; N& o
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项7 G4 W# h3 E. F0 B
                            if(t==1) v<-v-0.5*epsilon*pFW2
    " l% V+ H3 e8 f9 Y9 t- a                        else{
    ) T0 U4 I, d) n                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);# x1 z9 p* {6 Z7 G! C/ B) A2 k8 P
                                    pFW2t_1<-pFW2;
    ( Y6 B8 ]' J4 Z0 K                        }
    ; ~. [6 O$ O( y+ e: L                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连$ g1 C6 T# k. g& K7 x/ e8 U
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导  H& K% h" i" ~7 U. m
                            if(t==1) w<-w-0.5*epsilon*pFW19 }- W$ S: E" m" k9 e6 Z
                            else{. U8 ^  v0 ~2 P/ k
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    6 n8 t2 c+ S6 k& t                                pFW1t_1<-pFW1;
    / {0 T4 R3 d) q$ x/ v                        }
    . y( o- o- H2 {. @) t, [" a, h                }
    # p& z* u, r! B0 z& I, q  f                N<-N+1;
    & V6 V* T5 A) c2 C# v" i: e& m# I                ei[N]<-FW/J;
    5 X$ V, k- T* H+ I7 f2 P        }
    6 [1 |) s% Y5 `# I8 Y+ K) O. ?$ T        theta<-w[nrow(w),];#隐含层阈值# d) S& y) X( d
            gama<-v[length(v)];#输出层阈值7 N3 n. _: l$ n( g
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重5 ~% \' V6 D0 k5 s
            v<-v[1length(v)-1)];#隐含层对输出层的权重3 w: h% }5 ~; e- J
            list(theta,gama,w,v,N,FW/J,ei)
    1 p' W8 U& A6 r: J}* |) d- V0 J- \/ @6 ?8 L
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);
    ' C) n- M$ u0 P, k( `9 Nx<-t(x);2 W# ]- N# \3 |( l) e* {
    hidden_threshold<-runif(11);
    $ H% y4 f1 E9 @5 ^- R# A  b& xoutput_threshold<-runif(1);8 F' g+ c, e' k* [9 z
    w<-matrix(runif(77),7,11);7 t  G1 x' r  n) [" r# u( I3 S
    v<-runif(11);
    6 }* d3 }2 a& o0 M1 j. presult<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);' T; y) s3 _& ]7 T/ N: M6 j
    #输出
    0 R0 M; Z8 M9 Q% R2 L; ^cat("\n");
    $ [! a+ }) P$ R, \9 Ocat("隐含层阈值theta","\n",result[[1]],"\n");
    9 H0 M: j; ]* J* b4 s0 r/ Zcat("输出层阈值gama","\n",result[[2]],"\n");: m9 {9 c8 A% i  l
    w<-as.matrix(result[[3]],7,11);; V' q2 B5 Q" ]
    cat("输入层对隐含层的权重w","\n");+ M/ g3 U1 y; @4 k9 q1 M
    w;7 n- Q8 w3 t8 n5 q
    cat("\n");
    " P0 S- ^  w3 A+ I( R/ S% Gcat("隐含层对输出层的权重v","\n",result[[4]],"\n");8 A! J. W! M7 a) b; @
    cat("迭代次数N" ,"\n",result[[5]],"\n");
    9 k; X1 A' j2 c7 mcat("学习误差FW","\n",result[[6]],"\n");
    0 r0 @3 h& A  P  u1 A' Ycat("每次迭代的误差","\n");
    / M8 n$ U7 E. r* `( l5 Kplot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");, X# R$ s6 b2 |& J; U% q1 n
    proc.time()-ti' y  P9 z$ x& J9 ^1 ?" e
    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, 2025-7-28 12:48 , Processed in 1.068041 second(s), 79 queries .

    回顶部