QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18833|回复: 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()
    " F  `- h8 r- n4 S+ p% \BP_one_output<-function(input,output,m,fth,sth,w,v){
    + @+ y4 D/ ^) P8 I1 V        x<-input;#7*8
    $ ^; y4 H* c" L. G5 x  y# l3 r        y<-output;#8*1,y为向量,每一元素为一个样本输出值
    8 t. a! _7 I& C& j4 \        theta<-fth;#11*1* _7 h6 A  d6 v* ~% o0 s0 j* j
            gama<-sth;#标量
      n% h3 m/ T7 V        if(m!=length(theta)) print("阈值长度错误!")9 u* ?* X8 h7 T) i/ E
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重9 Q3 g# u" |% Q& ], M# P
            K<-nrow(x);#8一组样本的维数6 Z7 d* X& I* U/ J9 ~! W
            J<-ncol(x);#8一共有多少组样本
    . h& J% E; h: z1 e4 B3 {1 T        w<-rbind(w,t(theta));#由7*11变为8*11! D& C% k, b4 U/ u+ Y, k7 `1 s: J$ x# c. M
            v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    ( d$ X' [7 @1 E/ \* L. |4 ]#定义函数f3 G& L& Z5 ~, `$ [" O4 K  s) e1 x
            f<-function(h) 1/(1+exp(-h));  g0 n2 `  T. v/ _1 }2 E2 y, m+ M
            epsilon<-alpha<-0.5;9 K* O0 E. n4 p. G, D/ h
            N<-0;#重复学习次数的计数: p8 @: z# j" l% W
            ei<-as.numeric();#记录每次迭代的平均残差平方和
    $ M& v7 M& K. }+ Z- N        FW<-1;6 [, G- \3 Y7 A3 E4 R7 P
            while((FW/J)>=0.001){
    " ^9 q. z' H3 ]) [. f8 P' t                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本/ z5 H0 W$ {7 ]2 ~$ j0 r
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, * y0 M% d! t8 B9 d/ Q
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns
    9 o2 t- G+ T/ M, W3 W                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    - \; p* c4 J6 v3 A+ y& R1 P% @6 ?                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    $ l6 e6 m8 _% f1 p1 A+ P' h                b<-y-D;5 I% F, T( n# n) G0 p7 u
                    #J组样本的学习
    9 _! c: s+ P7 f1 K3 P3 ?                #向量,输出层对隐含层的权值的偏导
    % }# U( s* c- w                FW<-pFW2<-pFW2t_1<-0;
    7 R3 Z6 I, C& ?0 }" J: b' w" r% ~                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导$ O7 b6 Y* y1 S& I
                    for(t in 1:J){( j3 a! l4 Q1 _& x! ~
                            B3<-b[t];
    " p4 ?2 x8 g% L2 z                        FW<-FW+B3*B3;#标量* @* Q" X  p) D- x" `  |* j! A
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
    - G8 K  R0 c/ w  f* J                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项" i/ T2 S( p! h' y/ Q  Q
                            if(t==1) v<-v-0.5*epsilon*pFW28 [8 y# D# z. z! H6 [' Z* ^
                            else{: Z4 G  Y% h8 C9 l. t$ M9 W7 S
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    : ^: k( q2 c! i4 x- p. ?/ m$ b- w2 k                                pFW2t_1<-pFW2;
    9 P; K3 `7 v  y# c                        }  _1 [. \; T: _0 x% Y+ E
                            B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
    5 B. ~, }5 o5 r2 Z7 f4 A                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    . C9 J8 O& \/ c' o) ]                        if(t==1) w<-w-0.5*epsilon*pFW1/ N7 c# j* J2 B) W
                            else{, |4 A. L2 ]% y
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    ' o& Q0 J: x, Q$ @  a2 q2 L3 y                                pFW1t_1<-pFW1;
    + f' U$ u9 [. G3 H2 ~                        }# k3 z0 |+ c  O; |) p
                    }
    , ^4 k7 x+ `- C" C. N6 q1 \                N<-N+1;
      w8 W- s% n6 B/ y7 _4 c  r                ei[N]<-FW/J;& u; ~, k! D& Z0 r$ `
            }
    - Q, g7 v* i+ B  f        theta<-w[nrow(w),];#隐含层阈值* O: B6 t9 H6 x+ B7 s
            gama<-v[length(v)];#输出层阈值
    8 ]# {( O0 Y8 y) j        w<-w[1nrow(w)-1),];#输入层对隐含层的权重1 D- ]% J* e) l1 h' ]
            v<-v[1length(v)-1)];#隐含层对输出层的权重
    2 B5 \2 r, K9 N4 _/ ~7 r' d        list(theta,gama,w,v,N,FW/J,ei)& C5 A. h# r: k; ?5 R- J; D# l
    }
    + K. z& r: Q9 x) q5 r( Ex<-cbind(x1,x2,x3,x4,x5,x6,x7);6 j3 W' {$ L- U3 D. b
    x<-t(x);
    4 u4 D7 i0 h& E" M/ Zhidden_threshold<-runif(11);1 A" {& C! K3 o% B# T
    output_threshold<-runif(1);8 w3 s! a: w4 @, ^) Z# D# s9 [
    w<-matrix(runif(77),7,11);
    $ h/ r" u' n8 _5 J9 ^& K; i$ }v<-runif(11);
    3 h4 e( X: A; Eresult<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    , Q  D" E: C; {! L6 o/ N#输出3 _: T7 N9 e5 E( N$ `
    cat("\n");1 M6 ?1 }( U, ?; H
    cat("隐含层阈值theta","\n",result[[1]],"\n");
    ! }: v$ K3 h! m4 @cat("输出层阈值gama","\n",result[[2]],"\n");' m  y. M5 t, I) R
    w<-as.matrix(result[[3]],7,11);
    / W" K2 Y$ R& i" h9 i4 scat("输入层对隐含层的权重w","\n");
    . m# K9 m7 v6 X" M* N- Dw;1 ~+ N; Y) n+ j" p' g# n
    cat("\n");# u7 @# m! G5 h4 {' `
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    ! s# }: e4 K& q$ Z: Bcat("迭代次数N" ,"\n",result[[5]],"\n");
    " q/ G4 m% n, @8 d1 ?  ?, ncat("学习误差FW","\n",result[[6]],"\n");! V4 u5 u+ b5 U* B
    cat("每次迭代的误差","\n");+ t4 H, W% |: j4 N! S: h7 _
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");8 }: c8 j: b/ H: U6 S
    proc.time()-ti3 [) f( J$ r8 C" C! J
    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-7-10 10:40 , Processed in 0.368942 second(s), 80 queries .

    回顶部