QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18757|回复: 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()+ n: T0 l1 l# g# I, s* Q
    BP_one_output<-function(input,output,m,fth,sth,w,v){
    ! d& M( h, o& Y( ~        x<-input;#7*8
    2 I- {9 W% T4 k; N( q% D3 Z        y<-output;#8*1,y为向量,每一元素为一个样本输出值; g. _% c. i6 F2 B, j0 u) D
            theta<-fth;#11*1
    * t+ w' s7 e  ]/ I. G. `: T        gama<-sth;#标量
    : m4 R+ P' h6 K2 a5 K, K        if(m!=length(theta)) print("阈值长度错误!")% S! Y# \. a" U+ C/ X- z8 S# P6 f1 y
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
    " `; Y. m$ C6 e2 K/ a# l, r        K<-nrow(x);#8一组样本的维数: F- l4 S8 B  z( k- u
            J<-ncol(x);#8一共有多少组样本
    0 e9 C( j8 ]1 w, S: |; p, n$ C        w<-rbind(w,t(theta));#由7*11变为8*11
    1 O1 `- N7 |+ H6 g3 d5 D- T( T        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    " o* ?8 X6 O  q) `" w8 h1 u8 p#定义函数f7 n/ b3 \: M6 r/ ^. K9 ~
            f<-function(h) 1/(1+exp(-h));
    8 u- _$ N4 c4 _7 K; g; O        epsilon<-alpha<-0.5;" W  Z" m5 D: {0 I$ C. c4 C
            N<-0;#重复学习次数的计数
    . m; ?8 q3 c  H2 v+ \7 k# L        ei<-as.numeric();#记录每次迭代的平均残差平方和
    2 e0 F7 d. m3 T  X        FW<-1;
    9 v+ A/ u) k2 z+ r- U/ c& q, R, g        while((FW/J)>=0.001){3 h% Z+ r" {2 n7 `. O
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
    6 G# s5 c3 G+ h" ?4 V                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    7 @4 [/ R2 ?% E0 z. }( F                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns
    ; [6 h& {2 _! {' o* H                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    : `' p; c! Z- o# O                D<-f(Z2);#向量,每一元素为一组样本的一个输出值  d$ u! j* |; I" y- M2 e, b
                    b<-y-D;. R! T. i+ C2 [- j( C& e) e, t
                    #J组样本的学习7 P9 G- @$ C) Y/ \0 I: |
                    #向量,输出层对隐含层的权值的偏导6 d  Z; [( o9 ?; ?
                    FW<-pFW2<-pFW2t_1<-0;
    9 ~9 o7 ?" a4 H6 f                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导$ e. z9 p/ q0 x8 }
                    for(t in 1:J){7 K9 O- i: F3 d. w. m9 F, T5 ~
                            B3<-b[t];
    2 m9 R3 J) E! r/ x' j& ?% z                        FW<-FW+B3*B3;#标量: `9 Z* Q' K# Y' Q
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
    ) X$ R8 [" T! T( w! i2 P3 m, @                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项1 C2 G. p: e. i) w; A
                            if(t==1) v<-v-0.5*epsilon*pFW2
    ( z- B5 O' `* ~3 Y6 h/ _3 C7 w) ~                        else{
      Q6 k$ j( \: z% C( ^                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);% R2 D: d* Z$ N# l) |
                                    pFW2t_1<-pFW2;
    3 |, F1 a) F3 `4 z1 Y" k' V                        }
    ; Y5 @3 o/ i2 S0 f* F                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连& w3 i* V/ H5 I% y
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    . I1 G  K* }  A4 q                        if(t==1) w<-w-0.5*epsilon*pFW1% T8 U; R" t- U3 v
                            else{' p3 h9 U) ^) A' _! L
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);8 v! N2 e# R7 R. i& n
                                    pFW1t_1<-pFW1;
      K' @  R% L3 \  K* }# ~! J! @                        }
    7 O6 w" X$ D$ H) Y# M                }
    & _3 T' R( j4 u4 B* j" H: @, Z                N<-N+1;9 Q# W* F% z) X. Y. E' W
                    ei[N]<-FW/J;8 _' f: E: Z- }) U5 N' I' G, U6 L
            }
    " U1 Q9 l- A5 p( a$ u! F        theta<-w[nrow(w),];#隐含层阈值; D: [$ N+ S, m
            gama<-v[length(v)];#输出层阈值. H0 d  \' Q6 ~5 `
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重6 R* R2 A/ q/ h# Q4 H& e
            v<-v[1length(v)-1)];#隐含层对输出层的权重) ?+ r+ l4 a* [0 q/ G; g
            list(theta,gama,w,v,N,FW/J,ei)
    & }6 \& J. J4 u}9 n: r/ N: [* W0 N0 z7 c. z/ R. ^- e
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);4 N4 v' z5 E  A, _+ {
    x<-t(x);1 S* B& H4 c  y6 T
    hidden_threshold<-runif(11);
      Y) A& k6 f, doutput_threshold<-runif(1);$ D' q7 B; c8 m, W5 g7 q
    w<-matrix(runif(77),7,11);
    + R7 w% e( e* ~7 N8 _v<-runif(11);
    : W8 A2 |6 R/ O8 v) Lresult<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    - A/ I8 C! C4 k#输出
    . c  M5 q  @+ X% @5 S$ V. {cat("\n");
    7 z4 P- |3 w; d6 b+ v+ p0 qcat("隐含层阈值theta","\n",result[[1]],"\n");+ d) E" X4 O0 q4 ~
    cat("输出层阈值gama","\n",result[[2]],"\n");/ ?9 a+ b( Z# p- M  M; e
    w<-as.matrix(result[[3]],7,11);
    1 i9 @# h, L8 R  U% mcat("输入层对隐含层的权重w","\n");
    ) m* j  o. k  `4 G# K* f; {) Ew;5 @0 F2 E5 W- l$ r, ]0 R9 ^! f
    cat("\n");1 R0 W6 @) P. J, N
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    - j+ ^$ L& ~+ j, E) `cat("迭代次数N" ,"\n",result[[5]],"\n");
    7 c( k' K" z4 s3 C3 @4 F' R1 ?cat("学习误差FW","\n",result[[6]],"\n");; j- v- R9 C0 W" G
    cat("每次迭代的误差","\n");
    % G7 [) U2 S  r4 rplot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
      k* V# C9 O% Uproc.time()-ti5 l# t. r. |8 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-4-11 19:34 , Processed in 0.455506 second(s), 79 queries .

    回顶部