QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18831|回复: 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()
    4 L( @! ^7 D$ z/ V" eBP_one_output<-function(input,output,m,fth,sth,w,v){+ b! k: o: N/ M( P5 @% \
            x<-input;#7*8
    - u+ P) E! f9 b- b1 Y        y<-output;#8*1,y为向量,每一元素为一个样本输出值0 R: }# r$ g$ w& U# i3 D0 A0 ~0 b
            theta<-fth;#11*1
    1 n! u8 K* ~( n5 ]- B( r9 Q        gama<-sth;#标量2 Z5 \) a+ q+ I% X) C% i7 g+ b+ @
            if(m!=length(theta)) print("阈值长度错误!")2 t" g6 }" \% L: Z2 G  d0 j
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
    1 G0 a6 d! t. G: i7 @        K<-nrow(x);#8一组样本的维数$ W/ p$ u2 [" C6 o& M" G
            J<-ncol(x);#8一共有多少组样本2 y+ |- S& f& g# F5 W7 a! m- P
            w<-rbind(w,t(theta));#由7*11变为8*11/ G4 E- R# i1 Z' n) F5 ]' `
            v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接+ Q2 }7 @# p' B; n0 n
    #定义函数f
    9 h0 e+ F# ^9 J, F# Q        f<-function(h) 1/(1+exp(-h));
    : n. z: t' C: s0 j" `        epsilon<-alpha<-0.5;
    1 w* M+ K) J5 J        N<-0;#重复学习次数的计数
    - {1 Q5 i1 Z8 `        ei<-as.numeric();#记录每次迭代的平均残差平方和$ Q% c0 a" `- O# J4 h  w
            FW<-1;
    7 k/ O2 d9 ]& J  U% {        while((FW/J)>=0.001){/ y- f+ Z- f2 z- c4 C; A& h# a3 K
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
    - c' e2 n7 [6 T4 z                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    " [9 R0 @  q7 F                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns
    ' g* E+ O& @( X+ d4 m+ y3 A/ o                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    ; D1 O2 }6 l. V7 A' V4 v                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    5 M4 n& ?" C- s# \* W9 a                b<-y-D;7 T$ t1 D* n% f0 k* V8 A; u+ p
                    #J组样本的学习& H6 W6 K7 L1 @2 v7 I
                    #向量,输出层对隐含层的权值的偏导/ S0 P( P: r4 ?; @  ~* y
                    FW<-pFW2<-pFW2t_1<-0;2 {" n- C9 p+ S, B  h# x1 i, V' F
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
    2 i6 v* m. w. j, O' F                for(t in 1:J){
    / ^( {: a( g, F8 i3 A. b                        B3<-b[t];: V0 v" [: V4 G% b9 p2 i3 y
                            FW<-FW+B3*B3;#标量: R; L) j: z1 D" }  l$ l
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量" A0 O9 f* n8 `- j% C+ f
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    1 O& T" _9 D# u. W4 B' d                        if(t==1) v<-v-0.5*epsilon*pFW28 X* I* |5 S6 l$ I: l: ~+ n. E" n
                            else{
    * v4 a" ~- U- k( k0 [- Z+ p8 _6 `                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);: s" B8 Z! S$ |3 v4 \: i
                                    pFW2t_1<-pFW2;, @7 H+ m: S3 @3 |+ e# y
                            }: \4 X% w! G/ {( c& V& i- v; r
                            B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
      ]# k3 [7 X6 }% t! b6 x: }8 p                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导  x; e0 H1 J$ N. H4 u7 X+ d
                            if(t==1) w<-w-0.5*epsilon*pFW1$ b) t& v. Q4 T' E  X' O1 ^( a8 R
                            else{
    6 J; |/ [* M3 ?! P3 z* @& N  e                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    . r3 L6 W# ~2 T                                pFW1t_1<-pFW1;
    ; G6 A$ e: G# N, f2 S  S4 V. Z                        }+ N# n, X$ G, W9 c# S. T& R. ~
                    }1 a" p# f# K% |! _# Q
                    N<-N+1;9 n6 _3 s9 L# z$ {+ n9 m
                    ei[N]<-FW/J;
    4 n8 k3 w9 u! t+ n8 z        }+ U0 K# E6 o" x1 T: \1 {9 f
            theta<-w[nrow(w),];#隐含层阈值7 C0 t, p% D- B" ]1 _' D( u
            gama<-v[length(v)];#输出层阈值# Z) H$ ]  \" M& ~$ R
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    2 T6 m/ t3 g# D& U% P5 r% v        v<-v[1length(v)-1)];#隐含层对输出层的权重+ A! t( J1 Y6 \% j
            list(theta,gama,w,v,N,FW/J,ei)* q" o- s7 x  Z/ U- L
    }! R; `3 _% h7 g% _
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);3 s. |* m, I* _8 t! c! m( J" R% G
    x<-t(x);
    9 N2 g* u) P5 ^9 }1 Chidden_threshold<-runif(11);
    . ^  H% x% E7 x$ l  Z4 _output_threshold<-runif(1);
    : s" b/ w) n( X' ]8 j1 [! kw<-matrix(runif(77),7,11);5 T4 z% }( m# D0 a
    v<-runif(11);2 z+ f$ G3 D/ Y" S) d: a! i4 j
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    3 C: |6 z" H7 W7 b; V#输出
    + Q" V( `5 a& V- d( ]9 d: L6 scat("\n");
    4 B: t5 ?. ~* g& jcat("隐含层阈值theta","\n",result[[1]],"\n");8 `7 z1 q( [' \
    cat("输出层阈值gama","\n",result[[2]],"\n");$ O0 U; s" u- U  w2 R
    w<-as.matrix(result[[3]],7,11);
    . S4 j0 e" O! ?) n6 p& ~5 `) C7 v$ Gcat("输入层对隐含层的权重w","\n");% j' S: a) q+ p$ X! _. O
    w;; }) E3 ~0 F: A1 ~3 J. R
    cat("\n");1 e3 M" p1 I: b0 o" ~4 v" i
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    ( D$ D$ v+ o% L" b& O8 J& Hcat("迭代次数N" ,"\n",result[[5]],"\n");) }& `9 s2 N' ~. ^- _( m
    cat("学习误差FW","\n",result[[6]],"\n");) L& O- j$ i$ L+ f' R% d1 n
    cat("每次迭代的误差","\n");
    ; |8 g2 ]3 j; @1 Bplot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");" k, E8 R5 i) B
    proc.time()-ti
    3 G" f+ j! r& m
    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-7-10 04:59 , Processed in 0.467812 second(s), 80 queries .

    回顶部