QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18753|回复: 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()
    ; `" A% D- x$ j, F$ _BP_one_output<-function(input,output,m,fth,sth,w,v){- H, h4 U* ^. ]7 R" W
            x<-input;#7*80 O7 v, @8 I6 V6 l' [7 X, k
            y<-output;#8*1,y为向量,每一元素为一个样本输出值! t/ [  O2 |$ ^# M
            theta<-fth;#11*1
    - K: @9 }: F* o# M( A        gama<-sth;#标量
    * L' v' d& d: G* R, x        if(m!=length(theta)) print("阈值长度错误!")+ w) _0 i$ D5 P2 J. D$ y4 C
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重/ U# u/ {6 `% T$ C0 u0 [' x
            K<-nrow(x);#8一组样本的维数
    7 p. {- D" q" Y        J<-ncol(x);#8一共有多少组样本6 w2 x- u$ @  I; r6 |+ F
            w<-rbind(w,t(theta));#由7*11变为8*11. T/ {) ]/ l4 z( m- Q. X/ I6 J# H- u
            v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接6 R; A2 x. O1 E4 k+ W
    #定义函数f$ {9 @3 _, [$ ]" `
            f<-function(h) 1/(1+exp(-h));
    $ n( i6 }$ Y- t/ C9 V1 r) F        epsilon<-alpha<-0.5;: ~2 \: i! C- ]: O$ y9 O
            N<-0;#重复学习次数的计数4 \$ b0 ~  O% Z+ N7 I1 G) z& ~- O
            ei<-as.numeric();#记录每次迭代的平均残差平方和
      b# g& r: ^. W  E        FW<-1;* E( }5 t. f  q+ O
            while((FW/J)>=0.001){  X) l" u; U2 v
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本) Z) ]6 o; u& ^
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    0 _: T3 S; [9 [2 X- F2 U                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns4 }3 J' ^& y; D6 x1 O
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    5 e# O" m- a7 `8 r& O                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    ! G# X" _2 T  ~) K+ D1 b                b<-y-D;$ @5 `( }- @: T/ [
                    #J组样本的学习
    2 _# z- k6 `9 N! r7 N; |& s1 G) g                #向量,输出层对隐含层的权值的偏导
    . T# ?# x" z7 O                FW<-pFW2<-pFW2t_1<-0;& }- Z$ n% A9 _' S9 Z: j& {
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导0 g; u9 O' B  a9 I
                    for(t in 1:J){9 e* M$ g8 C3 o# O$ v& u" M
                            B3<-b[t];
    & u7 y9 k( h- A0 ~, |# G, o4 b                        FW<-FW+B3*B3;#标量8 R: b! G" z9 J. [/ M; u" s
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量/ H7 o1 V- ~% O) H* u5 F
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    ; |( R8 ~7 W; ~( }: c                        if(t==1) v<-v-0.5*epsilon*pFW2. D' R' b; X) t% C
                            else{) }$ H6 Z2 |0 K+ R, U# M+ z0 f) N
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);1 |/ H. ?' S$ o8 u: X* S
                                    pFW2t_1<-pFW2;
    5 E, n$ f  m! T; u3 U                        }
    5 y* ~, a: J0 z7 v; X: R4 ?                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连. y9 j/ K  m' w. U
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导, y  k: w6 Z7 j
                            if(t==1) w<-w-0.5*epsilon*pFW15 `  L' O- ^* \3 g4 O% t+ [& u
                            else{# T* }, P5 b8 M( H% |4 b
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    ; \1 |# ^% X# f; {* z9 _                                pFW1t_1<-pFW1;/ c0 ~$ u4 |* ]6 d$ l
                            }5 [# W* W$ Y+ m4 z- p
                    }
    1 o! q) u6 M1 z* Q                N<-N+1;7 Y" ]7 C7 {! u2 W3 a% e
                    ei[N]<-FW/J;2 ?/ Y$ Z# g# ]( W
            }7 N. w  m0 n( s) o7 N6 K  @) k4 k3 H4 g
            theta<-w[nrow(w),];#隐含层阈值$ f/ f5 i. f7 ~; M* c
            gama<-v[length(v)];#输出层阈值
    1 S; A, K2 }/ o( k. D/ r) k        w<-w[1nrow(w)-1),];#输入层对隐含层的权重: p- {, u: [8 ~* A1 C$ G9 l
            v<-v[1length(v)-1)];#隐含层对输出层的权重
    ; ?1 G4 O# B( p8 o        list(theta,gama,w,v,N,FW/J,ei)
    3 T5 Q9 {# P1 u- T* h# B. _' ]$ m}
    0 A: Z& U7 g  |0 z& @& X  D9 ix<-cbind(x1,x2,x3,x4,x5,x6,x7);3 Z3 r5 a6 v& W; C3 |, c: s- K  n
    x<-t(x);
    ; I2 S; c$ w5 Bhidden_threshold<-runif(11);
    ) k) G  y' x# A& @# Poutput_threshold<-runif(1);
      p5 A. D) H4 m, h/ W; F0 Pw<-matrix(runif(77),7,11);% Y9 c) o6 [) m) T  ?6 ?* g0 S) D$ s
    v<-runif(11);6 U) k9 W% q9 O+ @
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);7 G, y6 W8 s7 X- R3 a
    #输出/ G5 U  l0 b& t; b  I
    cat("\n");8 q8 l+ c  v5 ?/ m- G. r; R
    cat("隐含层阈值theta","\n",result[[1]],"\n");  F: p6 \3 b) @( m' g( D# W
    cat("输出层阈值gama","\n",result[[2]],"\n");# I0 w6 w2 [' a7 _  W
    w<-as.matrix(result[[3]],7,11);
    ! l. h- X, q. y5 |  c' G  s; Zcat("输入层对隐含层的权重w","\n");7 T9 _  N2 d# i% p
    w;
    + m. w3 Y4 B% pcat("\n");7 u3 |4 d3 E& _1 B" z" `; w# H- X
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");" j2 f! h; Q! a1 r4 c
    cat("迭代次数N" ,"\n",result[[5]],"\n");( i# c8 W# W  ?% `
    cat("学习误差FW","\n",result[[6]],"\n");
    " t) B" V3 k2 h& _cat("每次迭代的误差","\n");
      @" s- K) Q% n5 c; P, w/ zplot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");6 G6 D- E& T3 x* {- S
    proc.time()-ti* Z# R& T5 x0 q1 M5 J2 h
    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-10 13:17 , Processed in 0.467915 second(s), 80 queries .

    回顶部