QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18763|回复: 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()
    - |/ i  P+ R6 I6 F7 B8 @BP_one_output<-function(input,output,m,fth,sth,w,v){
    / F8 G) ]2 O+ D0 @! e        x<-input;#7*8
    " a: ]. F2 l/ B4 J' y        y<-output;#8*1,y为向量,每一元素为一个样本输出值
    : i! A, M8 ^: K3 y        theta<-fth;#11*1
    6 F! t0 q" b8 \' @- d7 a) F8 g3 d7 W8 j        gama<-sth;#标量; s4 t6 {+ P# h  a
            if(m!=length(theta)) print("阈值长度错误!")
    * J; v* P, j$ Y6 X6 M1 T        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重- G! O% J7 ~1 k9 g
            K<-nrow(x);#8一组样本的维数$ d7 A9 f. R4 ^; I  `8 x" b
            J<-ncol(x);#8一共有多少组样本
    9 A  S$ F+ Z4 P/ t7 o        w<-rbind(w,t(theta));#由7*11变为8*11
    - M1 D9 \. X0 X5 k0 e6 j$ j, k  D) k( a        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    0 u3 o8 u% O: [#定义函数f
    6 Z1 U. a2 O. O1 z- r* d& Q: J        f<-function(h) 1/(1+exp(-h));7 `% t3 p# x: O6 u
            epsilon<-alpha<-0.5;' s' ~" T% h1 R9 a% g0 v- X2 [; U& O
            N<-0;#重复学习次数的计数0 i( ~* w0 m+ K; ^: ~
            ei<-as.numeric();#记录每次迭代的平均残差平方和; e$ h) n7 h$ u3 G0 \$ a6 Y) D
            FW<-1;% `% L! P. S3 n. Q# ?
            while((FW/J)>=0.001){
    % h+ H' J$ Z9 t/ d9 t. x  b/ y! D                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本7 H( Z7 r3 C6 W  K
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, 3 N4 p+ J6 ^- j! }& O
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns
    4 B) q7 G& r8 [% d                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    + z' [# r4 ]2 y, u                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    5 V9 g) ~% Z3 Z/ {. J) C& E                b<-y-D;
    . q# I6 h" r3 B  r                #J组样本的学习' _0 U1 Z" R& B0 N$ v
                    #向量,输出层对隐含层的权值的偏导& Z7 n# y- k" N9 o$ U- K
                    FW<-pFW2<-pFW2t_1<-0;
    # R2 p/ ^, Y# H                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导: q/ }3 ]: k+ n& F: Y: H
                    for(t in 1:J){4 R+ e. J& _! O1 n7 I
                            B3<-b[t];, [/ v8 C- O! @" q/ E1 V3 U
                            FW<-FW+B3*B3;#标量
    + o6 z  E$ E! e' s                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量3 k4 R& T" f2 m$ N8 `
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    3 ^. s4 p4 s: X& Z" `                        if(t==1) v<-v-0.5*epsilon*pFW28 f/ [9 ?- r$ M/ Q) k
                            else{. o) [$ O& v0 F" E1 }/ {, C, _
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);4 Y+ X7 Z. M& \4 r  ?2 f/ Z
                                    pFW2t_1<-pFW2;4 f2 b7 u8 _3 Q8 w3 R; X; k
                            }1 R9 ~5 F8 K! L1 Y8 h5 c
                            B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
    ; |6 C3 n0 l) H5 e% _! [9 _                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    2 Y) }0 [* ?! |3 a; i                        if(t==1) w<-w-0.5*epsilon*pFW1( ^4 T8 F1 o, q5 h" u& v
                            else{8 H" F9 e9 X" `/ ~4 T1 v; b
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);5 o# A, ?8 W' e3 v$ _3 U
                                    pFW1t_1<-pFW1;) b% a, F. a" O: M  J2 L
                            }9 d' o4 ^' W6 S- e3 w# G  \
                    }2 a9 c5 b8 }/ W) _" j9 s
                    N<-N+1;7 g' k9 `8 n1 [' [' w
                    ei[N]<-FW/J;) X/ w3 h% d2 V/ N  z
            }6 t2 n2 B$ t9 |; I
            theta<-w[nrow(w),];#隐含层阈值
    0 `5 f- L$ a) Q  f        gama<-v[length(v)];#输出层阈值0 X# D5 U* g3 J8 Z0 S6 o
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    # `+ v2 {' f1 z5 F+ x" p        v<-v[1length(v)-1)];#隐含层对输出层的权重3 w8 D+ o4 o3 \
            list(theta,gama,w,v,N,FW/J,ei)0 D/ d" \6 {0 {# T; ~" m8 X1 `; I: ^
    }* m1 P+ F# V4 |2 v  a2 i4 ?
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);
    % a9 D, W4 L3 i) e% r$ gx<-t(x);
    + U1 j6 l) O8 [- t- Khidden_threshold<-runif(11);
    2 l) h( @1 U9 Foutput_threshold<-runif(1);
    4 L% |, ~" i& q0 f* C2 S% kw<-matrix(runif(77),7,11);) f) U4 [" t, d5 `! u0 U
    v<-runif(11);0 N& D9 y, ]+ W5 X0 u8 p
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    # h8 N6 ]6 e  U#输出
    , K) U4 k* `: g$ t. z" }5 Wcat("\n");0 m, Q1 W: n( o8 `
    cat("隐含层阈值theta","\n",result[[1]],"\n");
    / D$ Y* z3 V0 m, v# {1 [cat("输出层阈值gama","\n",result[[2]],"\n");% u6 A  ^2 @7 B
    w<-as.matrix(result[[3]],7,11);$ D# ]) V5 d- F9 B) Y$ b
    cat("输入层对隐含层的权重w","\n");: v4 t! h; u. V: B5 l
    w;4 |0 V8 i/ H$ |
    cat("\n");' o9 K+ ]# E% o. V
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");. j8 `, q! f7 H) v
    cat("迭代次数N" ,"\n",result[[5]],"\n");
    : _6 k  I/ U6 k- ^$ w2 bcat("学习误差FW","\n",result[[6]],"\n");
    # i- g7 F' [: O/ }- X5 @cat("每次迭代的误差","\n");
    ) Z) b: v* c8 B$ ]- v2 ]plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
      Z- b- z* z9 k4 qproc.time()-ti
    : q0 l, k$ s4 u4 L# ^
    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-15 08:38 , Processed in 0.395356 second(s), 79 queries .

    回顶部