QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18765|回复: 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()
    " u+ E, }1 Z, t, ~4 q, ]4 U1 [BP_one_output<-function(input,output,m,fth,sth,w,v){. l7 \0 M$ v: P/ ]& u, e
            x<-input;#7*8& {) g7 H" Q) O4 J) n/ i
            y<-output;#8*1,y为向量,每一元素为一个样本输出值8 [! r6 e; o  s3 D
            theta<-fth;#11*1
    4 x+ R9 p/ d! H  b& C4 b, k        gama<-sth;#标量1 h! a8 e+ U0 D$ X" g
            if(m!=length(theta)) print("阈值长度错误!")
    1 T, F) W3 m0 q, q6 q( S        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重1 B9 F" I, Z& x" u2 z* R+ c) w0 J
            K<-nrow(x);#8一组样本的维数5 |( w3 R6 m! n1 I; C6 C  O0 N5 I
            J<-ncol(x);#8一共有多少组样本
    : Y5 ?  A5 [0 v0 {9 H. Q: D! w        w<-rbind(w,t(theta));#由7*11变为8*11
    2 w' M, i9 f/ M: h" l) S8 Y$ V        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接- G+ f) O' r( Y/ O
    #定义函数f
    + }  ]7 ~2 H* O5 f& p4 r& i        f<-function(h) 1/(1+exp(-h));, Q+ s  y) Z+ q2 g- b
            epsilon<-alpha<-0.5;. ~9 j3 D5 q! O( t; F
            N<-0;#重复学习次数的计数& r; x1 ^8 Q& `0 s
            ei<-as.numeric();#记录每次迭代的平均残差平方和
    ! H0 H$ T9 L" \; L$ W; C: K" Q        FW<-1;
    6 L4 u; i' ~5 r: j) ]# j        while((FW/J)>=0.001){
    + h  M% l/ i) `  l% j* g                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本& W- I% _9 i9 g& C
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, 7 y$ L9 [% r# I* e3 O
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns4 e6 Z8 C$ G( @6 D
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    : a" i: g! o! `4 T5 T                D<-f(Z2);#向量,每一元素为一组样本的一个输出值( u+ V5 o$ q5 ]# ~
                    b<-y-D;
    / o" x: L( `+ l/ v  ^2 h& E4 z                #J组样本的学习
    $ S1 H7 m( X% [6 S                #向量,输出层对隐含层的权值的偏导
    4 o8 t- T* o. s                FW<-pFW2<-pFW2t_1<-0;
    ! [) W0 t! T  \/ l0 c9 a                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
    : i& u6 v2 B1 Y( P                for(t in 1:J){5 y2 g6 d# b, d) y
                            B3<-b[t];
    # w0 P* _  ~0 E                        FW<-FW+B3*B3;#标量$ t5 a2 m* {2 Y: `0 ^. J
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
    + b0 U6 N! m! `7 i/ c  u                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项$ j% v: Y1 U# \3 S
                            if(t==1) v<-v-0.5*epsilon*pFW24 R5 ], w' b/ c8 p" K% _
                            else{
    0 s: [; Y4 l; g, q' s) g3 C! O0 C                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    ' @! E% O0 D$ A1 h. B                                pFW2t_1<-pFW2;5 _1 m* h- e, d; A6 |
                            }8 y6 o$ U( `: T, W2 _
                            B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
    " s" z9 l. C5 v' K# j7 v* ~" M% S                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导. A* {' i: ]2 c3 x% Z
                            if(t==1) w<-w-0.5*epsilon*pFW1  S( u; l! b9 j+ A6 T
                            else{
    0 @. a% @8 ^4 U/ ~) d% `6 P                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);, ^! [0 y( \# O) ]2 M% W
                                    pFW1t_1<-pFW1;
    4 w6 D7 a3 p# e5 D2 @( @8 j' h  _. i2 t0 t                        }( ^6 ?- O  Z5 ]5 @
                    }
    ' L- O+ R& ^; r" N0 T( l/ y                N<-N+1;" R  R: Z0 S+ Q5 S) I. W8 L5 q& l1 ?
                    ei[N]<-FW/J;
    3 K0 @) _: v; j  E        }
    3 j# |( Y5 q1 N# E3 O: @        theta<-w[nrow(w),];#隐含层阈值
    0 s& R! q0 z  E! ]        gama<-v[length(v)];#输出层阈值% }* ?: Z* Z  `5 _/ A. X4 {
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重6 y, S, r+ }4 \  W3 Z$ g% y
            v<-v[1length(v)-1)];#隐含层对输出层的权重  i! L; s! h, D2 f
            list(theta,gama,w,v,N,FW/J,ei)
    5 T6 y9 Q2 B3 p}
    " I+ ]. a% T: ?x<-cbind(x1,x2,x3,x4,x5,x6,x7);- G- F& b4 V% [5 e( p4 Z, x$ g
    x<-t(x);$ \/ v9 E* V  y* P* [+ Y5 ~
    hidden_threshold<-runif(11);
    9 \! l: [8 j6 y2 S; h/ I. Houtput_threshold<-runif(1);
    3 \$ u+ g/ M1 x, y% N/ gw<-matrix(runif(77),7,11);
    8 V+ q/ |. p! Y' wv<-runif(11);
    % u, [# Y' H0 }0 m" eresult<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);  P5 @* O0 u' I0 E
    #输出; I- j9 m& D. G; v
    cat("\n");
    ! T7 L- S, k8 Z" Pcat("隐含层阈值theta","\n",result[[1]],"\n");
    $ y5 v$ I: G7 u9 V% e6 qcat("输出层阈值gama","\n",result[[2]],"\n");
    2 w; M- }% A6 O& S* M: v) r' [w<-as.matrix(result[[3]],7,11);
    3 t$ e) e' l) x  ?4 Ucat("输入层对隐含层的权重w","\n");2 `4 N* g) p4 g, i4 V
    w;6 ~1 ~' a; o  B. z: Q4 J' I+ W4 Q
    cat("\n");) M) _3 `& d. Z4 d0 S
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");5 {8 w: J2 N% A; K) ^5 A' }
    cat("迭代次数N" ,"\n",result[[5]],"\n");
    4 Q1 ~1 D' S2 B$ x3 wcat("学习误差FW","\n",result[[6]],"\n");
    * V9 p: Q. H3 {) B" a0 e& Mcat("每次迭代的误差","\n");
    * h0 q1 r8 C3 \. y. j# Bplot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    8 E! Q2 e0 _" I: P1 i2 Pproc.time()-ti& Z( F8 }$ |8 ^9 n9 f
    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-4-21 03:13 , Processed in 0.455652 second(s), 80 queries .

    回顶部