QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18762|回复: 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()
    : b0 V0 n) v. V8 T1 d, q7 sBP_one_output<-function(input,output,m,fth,sth,w,v){( i, ?- y: i& Z( f" a) e( N! B. X
            x<-input;#7*8+ a- g! x* `8 i$ [) h. R/ F
            y<-output;#8*1,y为向量,每一元素为一个样本输出值  V8 H7 @8 z" K2 s. V
            theta<-fth;#11*1
    " P( z9 `! @8 w+ y& f5 H) c, h        gama<-sth;#标量
    " C6 d" s9 W* F, B        if(m!=length(theta)) print("阈值长度错误!")
    ! e2 w5 _6 z$ ~6 t        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重6 p5 [' C5 P# ?: K6 [8 y- ^  S
            K<-nrow(x);#8一组样本的维数7 A) Q; N& y5 [& g6 y
            J<-ncol(x);#8一共有多少组样本
    7 T4 P: \7 B7 r7 I: a% d        w<-rbind(w,t(theta));#由7*11变为8*11
    , W' n% P" c# c0 o+ D' I        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接* c4 D# C% h! K' q) }  U4 _# V
    #定义函数f
    / t% }+ t3 Z, O5 e) z        f<-function(h) 1/(1+exp(-h));
    % A- Z/ A3 {" L9 w        epsilon<-alpha<-0.5;
    / M0 U# U$ a: E# F        N<-0;#重复学习次数的计数
    % W" Y; J, d: I9 ~" v. R        ei<-as.numeric();#记录每次迭代的平均残差平方和
    # `, n' y6 o- F5 ]# G6 Q        FW<-1;
    ) N8 _$ }  t. v8 i        while((FW/J)>=0.001){0 S% \6 @- l" s5 Q0 y6 C7 Q
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
    + j" H2 ~' i: a# |$ U7 s- T' d6 I8 [                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, : T! N5 q& N- B- f; i  q0 B) R
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns% l1 Z& J0 \6 q* B# X; {  M# {8 z
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    2 K/ Z1 v/ t8 f6 ~: v4 y( `                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    ! n" ?+ C! L8 s0 U9 v% A0 c/ V4 n                b<-y-D;
    / A/ t+ w1 X( j' W$ q                #J组样本的学习" C' _: M& \8 z! _
                    #向量,输出层对隐含层的权值的偏导
    - M8 H+ Y( L1 m( k  W( Q0 _5 @8 A                FW<-pFW2<-pFW2t_1<-0;+ K/ {) H) P# N  V' W
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导( D/ d% A& U# s! B, ~3 Z0 b
                    for(t in 1:J){
    # c  G# H0 R1 }, h. w                        B3<-b[t];
    3 E' O' n5 h8 @5 m                        FW<-FW+B3*B3;#标量: S( o5 H' y+ h0 @# R5 w
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
    4 `. C2 l4 c6 W                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    ; F/ b) V& l7 D                        if(t==1) v<-v-0.5*epsilon*pFW24 b* R. }% k" t$ ]. v$ w  w  E2 k- _5 q
                            else{, u* S. E5 v' K# I* m. L
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);5 N- e4 \2 G* z( K1 }1 b, m
                                    pFW2t_1<-pFW2;
    ) G/ m( G$ T2 ~! A! W" b) I                        }
    1 n2 {4 V9 y) _- P                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连" [6 V+ |. I8 Y, Z" n
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导$ A1 e, a$ u3 {, l9 M$ s
                            if(t==1) w<-w-0.5*epsilon*pFW1# e' ]& q! Q% y1 x# F: |- I4 l- a
                            else{
    ) Y# Q4 J9 @, W0 q( o# ^                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);2 L  ^5 q+ `/ T1 Q
                                    pFW1t_1<-pFW1;
    5 U  ]9 e1 c$ X! E8 {9 a) Y" P* }                        }( e: y, p' K  z' Z( R
                    }
    - ~3 \, C8 G' w( F! ^, T                N<-N+1;( \4 r  @5 ?4 y$ ~% ~, E0 ]
                    ei[N]<-FW/J;
    . _% p2 M3 X5 f, q2 G, J5 [        }
    4 R# h4 H' z# f  M& s; P3 D        theta<-w[nrow(w),];#隐含层阈值* @9 i- J# K; {8 E/ O
            gama<-v[length(v)];#输出层阈值1 _; w7 ^) Y- O9 `
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    ( t7 x- W# \* u        v<-v[1length(v)-1)];#隐含层对输出层的权重6 M$ Y0 w% N0 f# f/ C/ [) {! E- u
            list(theta,gama,w,v,N,FW/J,ei)' j2 O! S) I# d  V
    }' i, k' T$ u; W* I0 Q& Y9 l% n; R
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);. t, W1 n; D7 j, m" T2 Y: r" d
    x<-t(x);
    4 l( l# `. T3 Yhidden_threshold<-runif(11);
    ! k0 a$ E9 d  d! {6 `( H4 ^6 woutput_threshold<-runif(1);9 l( Y( i3 t3 q! k: R# ^' h
    w<-matrix(runif(77),7,11);0 z5 H9 \' N1 t7 \4 p9 [
    v<-runif(11);
    ; }. N" }  O/ u: w1 K, @result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);) ~& M. V6 R  B/ X9 f* R. w$ _
    #输出
    ) \/ D6 j% Y1 c/ k* U( ]7 k9 Lcat("\n");
    + s  U( D' J1 z! b' y4 L: I- `5 Ocat("隐含层阈值theta","\n",result[[1]],"\n");7 F- G4 ^" r8 @4 z( n
    cat("输出层阈值gama","\n",result[[2]],"\n");
    , G6 R( d: z. Y& A: B( x8 M% ww<-as.matrix(result[[3]],7,11);* r% v2 e. \& f& o; q* J# j
    cat("输入层对隐含层的权重w","\n");
    # L) F. M) [% F0 [  _9 J  Jw;; {$ t* n3 Y. K; X! k8 q$ ~/ }$ G  U
    cat("\n");
    3 R# h1 [3 O, e  I; h$ {cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    ; a- ]# o+ w/ S: D. icat("迭代次数N" ,"\n",result[[5]],"\n");
    / A2 T- E% s/ j+ _& E% Gcat("学习误差FW","\n",result[[6]],"\n");
      u6 L& P0 ~2 E5 t) S5 mcat("每次迭代的误差","\n");5 A) K2 o; j8 y( ~& X/ _. E
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");+ J+ K8 u* S+ H8 ]0 i+ @
    proc.time()-ti+ L0 P) T0 w; [; 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-14 03:48 , Processed in 0.475804 second(s), 79 queries .

    回顶部