QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18463|回复: 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()# Q, p5 \6 t' `8 ?
    BP_one_output<-function(input,output,m,fth,sth,w,v){/ l+ X! ]2 I9 R
            x<-input;#7*8! h4 L$ i8 u/ E% P" Q6 P9 p
            y<-output;#8*1,y为向量,每一元素为一个样本输出值% l) f: U, M( D
            theta<-fth;#11*15 ~3 `& V; T% G
            gama<-sth;#标量. @/ X: k0 H5 G$ s. C
            if(m!=length(theta)) print("阈值长度错误!")
    * r6 ^1 m* Q1 Z5 b+ S- z* x" M7 T% \        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重2 o+ h  q  B4 b. F6 o$ V: \
            K<-nrow(x);#8一组样本的维数
    ' s; R. ^0 N5 J  B        J<-ncol(x);#8一共有多少组样本
    : }: K% |  ]' p4 @3 ^        w<-rbind(w,t(theta));#由7*11变为8*11
    " W4 O5 z( `9 n+ }+ U        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接% H8 H9 l6 t5 `6 `) T/ v. I( O5 s
    #定义函数f
      E( I; T. M5 M& M        f<-function(h) 1/(1+exp(-h));
    - j/ k0 K5 q( f0 f3 I2 L( ]' X, i! x        epsilon<-alpha<-0.5;$ v; d2 `1 A3 Y3 F) w
            N<-0;#重复学习次数的计数* I# ^% Z) L. t- |: {
            ei<-as.numeric();#记录每次迭代的平均残差平方和  J: d" o7 R9 D/ w+ M
            FW<-1;
    1 x+ v+ R9 A: ^& |0 g3 W        while((FW/J)>=0.001){. N& y* V& s* ?) I2 Z4 P- P
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本$ b- N6 e, x$ {! g# S; j
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    1 S8 p  E6 s3 v0 j" ^! R                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns
    % e& E! k. m2 e( i$ M- |9 o* W                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    ; R; k% H* M. n                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    ! ]+ Q, Z+ D2 ^8 e: v2 ?                b<-y-D;
    1 X4 q6 T+ @# J% Y) p                #J组样本的学习
    ) B6 o0 h) t$ |- V6 B6 j# @                #向量,输出层对隐含层的权值的偏导$ I  q& [7 b: d: m
                    FW<-pFW2<-pFW2t_1<-0;
    * y' z; i5 v3 G5 v2 w: `                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导% \9 d+ w7 S' [
                    for(t in 1:J){
    3 D9 r! l" x+ A+ M; z& ^! H. A                        B3<-b[t];# t! x8 L) N2 Q. T2 e. S( w
                            FW<-FW+B3*B3;#标量
    5 j6 ^, T0 g. H" L                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量+ s: s2 s  B7 ^$ L  s+ A# g4 Y9 ?: E
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项& ^3 s6 f  w+ Q6 n
                            if(t==1) v<-v-0.5*epsilon*pFW28 p! Z: h1 S% v
                            else{" n: ^5 l* v& O+ z4 X+ b: q! s
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    * \4 }$ t' m: R, g                                pFW2t_1<-pFW2;6 y+ |( V' O* w* r+ i( L
                            }
    ' c$ B8 v) g/ |1 F9 J                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连- x( z5 k* w. ?; P+ C0 M
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导+ A' S8 Y' v6 Q1 z0 W1 n, r* Y4 U8 h
                            if(t==1) w<-w-0.5*epsilon*pFW1
    $ G3 _, ?. Q! \8 v                        else{5 C8 W9 ~" ]2 H9 e4 P$ V
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    5 @0 F) _/ n+ }4 m                                pFW1t_1<-pFW1;
    # `) N& }; O6 S1 u( E                        }6 I; ?1 A( `6 N$ p; {
                    }
    9 l: n) G! \+ C3 Y  S% `                N<-N+1;
    ' [2 D# B  W" U4 U# ?5 v                ei[N]<-FW/J;
    , l8 d2 Y4 ]+ q- Y, y7 N        }5 z* \. j) o. v
            theta<-w[nrow(w),];#隐含层阈值
    6 B- L' h4 f+ C9 l' T; @9 w        gama<-v[length(v)];#输出层阈值7 I( ]% L4 @7 p- Y" U+ Y
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重% o4 J$ P" A& t3 G$ r4 l$ B
            v<-v[1length(v)-1)];#隐含层对输出层的权重4 A( [1 O% u4 X
            list(theta,gama,w,v,N,FW/J,ei)
    , U7 T& o3 g% \4 o/ S}( t. x. p4 G, m
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);( ]* M: F2 B, Y- z7 |
    x<-t(x);
    # M$ P* P& `* A) _hidden_threshold<-runif(11);
    0 `8 b- E1 r+ \output_threshold<-runif(1);  j4 v0 A" Z# l2 Q0 P2 s
    w<-matrix(runif(77),7,11);
    % [. e  n! x+ Nv<-runif(11);$ y6 `# @8 X3 Z  T
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);+ ~! \- b( k5 ]8 u7 A+ P
    #输出% d0 p' K6 n" l) G7 P6 G: `
    cat("\n");
    5 }! L5 ]! i7 [5 w$ ^2 }. Zcat("隐含层阈值theta","\n",result[[1]],"\n");
    ' X" ~$ T" d8 g1 mcat("输出层阈值gama","\n",result[[2]],"\n");
    ' I1 ]' b. w9 t8 |1 r- aw<-as.matrix(result[[3]],7,11);
    / a, x. G7 {' tcat("输入层对隐含层的权重w","\n");
    $ F* o7 G9 l+ H1 D1 Ow;1 k9 ]3 n. s7 m
    cat("\n");" v- K/ l2 o- }) v( S5 ^6 h! j$ Y
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");. ?& [9 i# E3 s
    cat("迭代次数N" ,"\n",result[[5]],"\n");
    + w0 @  m; q( |4 H* T# z  J2 lcat("学习误差FW","\n",result[[6]],"\n");
    + Z4 C; t' g# ]2 \cat("每次迭代的误差","\n");4 k9 S8 }8 w% H! d+ W, d5 O! n. G. a
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");( w6 l7 g5 b$ z
    proc.time()-ti/ q' P* s" X5 U- |
    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-7-30 11:39 , Processed in 0.524173 second(s), 80 queries .

    回顶部