QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18998|回复: 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()
    8 i: ^* t, Y; h* O5 OBP_one_output<-function(input,output,m,fth,sth,w,v){' T1 l$ j# S  |) u6 Z2 f
            x<-input;#7*8
    ! o* x' O; f( a4 J- K( u        y<-output;#8*1,y为向量,每一元素为一个样本输出值
    ) [) z0 Q! f: k1 f8 m        theta<-fth;#11*1
    . X) ^  B1 I) e( S$ T( P) ^        gama<-sth;#标量$ a: D( E& k. U, M+ F
            if(m!=length(theta)) print("阈值长度错误!")
    * ~4 h& K: L) [7 Q: N- k        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重3 _5 p& K  k% x2 N/ s
            K<-nrow(x);#8一组样本的维数
    7 R* q4 M9 l$ P# R7 K: O        J<-ncol(x);#8一共有多少组样本
    $ e7 B% K$ X; v4 ^        w<-rbind(w,t(theta));#由7*11变为8*112 i6 x" V) K4 A- @9 V: R9 ?- T& F
            v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接4 \! w0 {' `7 E/ Y6 U& [
    #定义函数f
    ( g1 I7 n8 E" E" L4 j1 U        f<-function(h) 1/(1+exp(-h));
    3 F/ F$ |3 f# r8 Q6 m8 ^        epsilon<-alpha<-0.5;! Y9 Y4 |% b# k
            N<-0;#重复学习次数的计数, R" r* k$ N! e1 Y
            ei<-as.numeric();#记录每次迭代的平均残差平方和
    9 ]& c0 W2 U; u& B' J  c0 W9 E        FW<-1;: C! Z% W3 p$ W2 E
            while((FW/J)>=0.001){0 T+ ]) D+ P- P( D/ j0 s1 B) P
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
    6 c% N( g9 V% A, o& P' }                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, 7 z; z1 v! O! h6 m5 I! B6 y! z! v; o
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns
    / o) K( A# p: @3 L& }$ [9 m                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值0 k. C6 b2 C4 ^$ g4 R7 A
                    D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    0 a% i+ k3 t; ~+ [                b<-y-D;
    : p4 L) r, V5 a; G! h                #J组样本的学习2 ~/ |& C3 l* y  H  P
                    #向量,输出层对隐含层的权值的偏导
    : u( _" i% ^- O6 l  @                FW<-pFW2<-pFW2t_1<-0;0 s! y4 M6 ^; O( a+ G
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
    + v% \5 J3 E* m$ F! k4 k                for(t in 1:J){% N3 c8 S( K. I2 Y1 r+ t
                            B3<-b[t];/ Y: X/ H; j8 a- B* {: o$ K) F. j) F
                            FW<-FW+B3*B3;#标量2 j8 n, o0 U& `3 A& y
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
    ( i) f/ c0 e+ a1 S& N                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    * p' G- e, j0 L8 S! n! \                        if(t==1) v<-v-0.5*epsilon*pFW25 V& P5 U8 i0 [4 B! r
                            else{
    ) E+ m% P& t  O                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);$ u: V- d+ s) ?! |
                                    pFW2t_1<-pFW2;
    ; S$ e0 S+ w' v7 q8 B) M. [4 P                        }) M- r' Y$ D% w$ ?" \6 v3 q5 P
                            B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连# e# F0 K/ d* w- [' y- }
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    : S  C9 o  k0 [& U6 V                        if(t==1) w<-w-0.5*epsilon*pFW16 p* A% ?8 q( q1 k+ \8 c
                            else{6 g3 x' n* N& f0 P' w
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    4 h5 m: }3 J8 ?1 R* j  r$ l9 U                                pFW1t_1<-pFW1;( K0 G$ I5 Q, {/ E& Z6 u$ m
                            }
    ; z9 w5 F2 d+ b8 v- \( C                }5 n, o% P7 ^& F* [. x7 M
                    N<-N+1;
    1 f3 [9 M: T. Y                ei[N]<-FW/J;- |6 B4 p0 I/ x, s' k
            }2 z5 s  p1 f6 I. f7 u2 w+ `* D
            theta<-w[nrow(w),];#隐含层阈值
    , J0 m  g% {% h  Z! L  T" T9 u& O        gama<-v[length(v)];#输出层阈值
    " L3 f' ~& \5 V        w<-w[1nrow(w)-1),];#输入层对隐含层的权重: r5 E, D, [& @% I
            v<-v[1length(v)-1)];#隐含层对输出层的权重  G- j0 T: W: S
            list(theta,gama,w,v,N,FW/J,ei)
    ( {; b* v7 \& H+ I9 O; \+ X}
    ; Z( d  ^( U! r: Vx<-cbind(x1,x2,x3,x4,x5,x6,x7);( r( x5 J, z' t) I
    x<-t(x);4 k- Y' X3 p/ l( A
    hidden_threshold<-runif(11);
    + S5 B: i% V/ n& M$ I) m% X0 [output_threshold<-runif(1);& R. C( S: k/ s* o5 q7 g
    w<-matrix(runif(77),7,11);
    ; o* k5 E" L' ov<-runif(11);' ^- _. V1 ~& P+ b* g+ H! r5 c
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);' M5 X4 `% d6 ]1 n$ H
    #输出
      D. g5 r; \) L( Bcat("\n");
    9 Q6 y' ^' d# Y, E! O0 I, }/ zcat("隐含层阈值theta","\n",result[[1]],"\n");
    1 z" P# J5 Q  p0 @: V- Hcat("输出层阈值gama","\n",result[[2]],"\n");' a% ?9 L, P5 A
    w<-as.matrix(result[[3]],7,11);
    7 q* i0 u# U6 f' }: L2 C: i: Gcat("输入层对隐含层的权重w","\n");
    ! F" I# E% R0 _w;
    ( W6 X. E. S1 B  c) }! e1 o) Xcat("\n");+ g' V8 d& w* M. o- u
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    + t. ?+ ^8 G2 `% U  c: y% Jcat("迭代次数N" ,"\n",result[[5]],"\n");
      ^3 ]+ y" M. A$ J8 H7 lcat("学习误差FW","\n",result[[6]],"\n");9 U, O$ h  k% F) |
    cat("每次迭代的误差","\n");
    1 p8 M# `7 ^/ P3 l! h% w2 O6 ~( tplot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");* s) u8 X$ s! N! a( t4 m
    proc.time()-ti( H/ e: I! N2 b( L$ ~0 E$ s+ p
    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-10-23 09:15 , Processed in 1.244747 second(s), 79 queries .

    回顶部