QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18491|回复: 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()
    + B" y" @. `" h4 [- A9 k+ L7 M9 [BP_one_output<-function(input,output,m,fth,sth,w,v){
    # ?; X! }6 C9 }. X' @        x<-input;#7*8
    + R' P& L8 e! B. h( V        y<-output;#8*1,y为向量,每一元素为一个样本输出值
    1 W% K3 W. Z. z; E0 {        theta<-fth;#11*18 ]# l4 P1 x/ c1 b% m
            gama<-sth;#标量7 j7 b. S8 ~, b4 P4 M2 z4 N, _
            if(m!=length(theta)) print("阈值长度错误!")
    ( K: ?* o, X8 [; O7 ?9 o* b        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
    . o: j. o) x. E2 C9 K8 l        K<-nrow(x);#8一组样本的维数/ X9 X: m! c6 j4 l# `
            J<-ncol(x);#8一共有多少组样本+ V7 H: r+ z3 Y& ^
            w<-rbind(w,t(theta));#由7*11变为8*11
    . l  f9 A7 J  E/ m        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接. \: D8 F( k! ?0 x. }3 J
    #定义函数f
    & t  _+ e, K2 @) d, K! ]) Z        f<-function(h) 1/(1+exp(-h));
    4 s+ c# c8 w. `5 D% P7 o        epsilon<-alpha<-0.5;
    1 X5 @* g2 B1 r. e+ V        N<-0;#重复学习次数的计数, a1 F) S# @% x; g5 T9 f
            ei<-as.numeric();#记录每次迭代的平均残差平方和
    3 ?! d! Y+ c# S6 H4 n% A        FW<-1;( L' {9 f+ r. G0 a
            while((FW/J)>=0.001){
    6 N; D! z; V! c+ j- M* j; Y' Q                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
    9 I9 E* i3 w( Q' v, a8 P/ j                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, % E3 y$ U6 A  ?2 I
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns8 i! k  d+ C4 I) d6 B
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值+ @+ X/ [  Y% p: d) A+ @% c" X# |
                    D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    , i% T9 L1 c7 \: o- c                b<-y-D;+ W; {7 @3 P& ^
                    #J组样本的学习9 ?$ n* d' v$ Y2 y0 O9 A. u2 J
                    #向量,输出层对隐含层的权值的偏导
    1 h* A2 ^- p. v& y% `! J                FW<-pFW2<-pFW2t_1<-0;/ r% e# q2 t( m9 O( T: S) ]3 t5 N( E
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
    - y* i! `9 x/ W/ D9 j8 Y                for(t in 1:J){
    $ O& c/ S) A7 s, I% b" C" t                        B3<-b[t];
    - e8 v6 c0 d% ?% |. ]) W( O                        FW<-FW+B3*B3;#标量# w) R0 L/ N/ F0 C2 B& g
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量5 W' S: [+ |, [6 d2 k3 a# L
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    ; N) a0 c4 n  S8 k7 M" c& \                        if(t==1) v<-v-0.5*epsilon*pFW2
    8 ?5 |$ @% h9 h4 f& |: K, C( n                        else{) j3 y4 e" @8 @
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);" y+ v: {+ v+ N8 q2 T" R! S& L
                                    pFW2t_1<-pFW2;
    ) ]" W, n# b) P3 f. O* c  D2 e# Z                        }
    6 o  w) ]; G/ n" I) @7 v1 j% s                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
    # q% V' k) {, k+ d6 g0 u                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导  Q9 T' F7 v7 l' }2 `2 n
                            if(t==1) w<-w-0.5*epsilon*pFW1
    0 z  Q1 @( \  c( [* y" t  @" L                        else{. I6 Y1 S3 g8 T! W
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    3 G$ O3 U- W3 k# N/ ]                                pFW1t_1<-pFW1;3 u2 n% A  j' |4 t; f$ I# m. ^- Z
                            }* ?* |  M% m/ l* ^- |
                    }% Z8 ]. f" k' l3 L6 F
                    N<-N+1;
    4 Q* Q6 h) g% `! g  n- M                ei[N]<-FW/J;; B. y) ^: D/ z; z0 x
            }
    7 p% r+ v* c1 X, {6 s        theta<-w[nrow(w),];#隐含层阈值
    ; N8 g5 C% J1 U9 a        gama<-v[length(v)];#输出层阈值
    ' P# J6 f7 J4 E8 g) o1 g        w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    $ S+ B0 L' w/ a' t2 T" s        v<-v[1length(v)-1)];#隐含层对输出层的权重
      G2 ?. Z# ^3 _% R  ]        list(theta,gama,w,v,N,FW/J,ei)! P. [, K4 ?: L4 M( `1 g3 j" x
    }
    5 n3 H! N/ p  Q0 J, Hx<-cbind(x1,x2,x3,x4,x5,x6,x7);' w. ^) F# `0 Z; F/ D- [6 b  t
    x<-t(x);& `4 g8 ?; ]* k) M, R
    hidden_threshold<-runif(11);9 n7 `! n7 U1 j6 D" x
    output_threshold<-runif(1);  u3 H) ]+ |1 L. O
    w<-matrix(runif(77),7,11);0 O- i9 l# f3 B
    v<-runif(11);
    & t) B8 P" [7 t. presult<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    6 a: l' f0 L! r+ v3 D9 k7 |#输出9 F6 w6 A! P3 I, R
    cat("\n");$ N3 Z4 X8 \) G  g  ?
    cat("隐含层阈值theta","\n",result[[1]],"\n");! y- h+ E* G. o4 F& h! Z1 I
    cat("输出层阈值gama","\n",result[[2]],"\n");$ o. d  o8 O4 E0 ^+ G  a) [
    w<-as.matrix(result[[3]],7,11);
    3 F: ^4 E* K5 f5 o. g# icat("输入层对隐含层的权重w","\n");! E( X2 Y+ x. d1 }
    w;! R  _$ ~0 B+ @
    cat("\n");
    2 \, M2 p! P' X3 l6 m- E+ |! g6 b9 rcat("隐含层对输出层的权重v","\n",result[[4]],"\n");0 x" j/ K& @3 p9 v0 D' Z
    cat("迭代次数N" ,"\n",result[[5]],"\n");. Z" ]7 W* \; T8 q; S6 y; y
    cat("学习误差FW","\n",result[[6]],"\n");* |1 ?7 B3 K( q8 \
    cat("每次迭代的误差","\n");, a  o  R! N& ]! G6 v$ r4 l/ F
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    # }( H( P# @/ f6 }proc.time()-ti! b; X! t* U$ F& G" H% i: o* 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, 2025-8-11 19:41 , Processed in 0.983722 second(s), 79 queries .

    回顶部