QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 19042|回复: 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()
    3 ^, _: I; ], ?1 M* T% ?BP_one_output<-function(input,output,m,fth,sth,w,v){# `' s6 X5 Q3 l4 {
            x<-input;#7*8
    ( X! ?; b$ {8 ^0 ]' M8 u        y<-output;#8*1,y为向量,每一元素为一个样本输出值- P# i8 M; [) k. @
            theta<-fth;#11*1! c  j- i" g6 u8 m3 b
            gama<-sth;#标量
    0 g  ^2 W. z( J9 I+ R7 ^2 W: g        if(m!=length(theta)) print("阈值长度错误!")6 m) E1 L: j1 J5 y
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
    $ l7 P* ?! q. V' r8 Q: M+ C        K<-nrow(x);#8一组样本的维数0 G& x! L) ^8 E7 }3 p/ J) D, Z
            J<-ncol(x);#8一共有多少组样本. I9 N+ ?& i& Z' A% b8 C; i5 p  w
            w<-rbind(w,t(theta));#由7*11变为8*11+ R) D% P" y- f) X6 O2 w3 V  [
            v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    : R5 ~# r  R, |5 x#定义函数f, K) g' o3 [5 U% {$ n
            f<-function(h) 1/(1+exp(-h));
    $ U3 a: @' p, [( c! I- e        epsilon<-alpha<-0.5;9 `( K- Y+ B- y( _7 q. n
            N<-0;#重复学习次数的计数
    1 L# W5 J8 i: a% V! o; B        ei<-as.numeric();#记录每次迭代的平均残差平方和
      s% M) ?: @+ I% }8 J* D        FW<-1;
    3 S1 g; M4 [1 S7 p7 O8 k  u9 s9 r        while((FW/J)>=0.001){
    ' \. k7 ?+ @. j) P! H$ f' x4 X                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
    6 j- l+ [5 v1 B& H: o" u2 O5 w( h8 Z                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, 6 U) y2 G- x1 u/ _+ J. D
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns( }' B) v( K* W: Y, g$ {
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值8 q2 Y) f# O9 g2 c6 T' d" v
                    D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    0 u. A4 L' [, z+ L% R. G4 d- J                b<-y-D;  J" o2 [# F1 K4 u$ S; U
                    #J组样本的学习
    ! j7 A5 ?; q( A. ?$ T                #向量,输出层对隐含层的权值的偏导
    ( m. U( k! |; v: O" \                FW<-pFW2<-pFW2t_1<-0;8 F* t; Z" J7 m+ o9 \$ y$ w
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导( d/ R# K. ?$ V& @0 S
                    for(t in 1:J){
    9 ]1 P1 ^1 s% J  K; J% i                        B3<-b[t];
    7 N0 n) F# Q' H1 O) Y: @, m+ u) ]$ [                        FW<-FW+B3*B3;#标量& ?# G. q1 f# Y4 k- `' M
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量: G% W4 l8 Z  a8 J
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    " ?2 i/ S4 B, G, E                        if(t==1) v<-v-0.5*epsilon*pFW2
    ) E/ N7 v( r9 E$ g0 S$ \: z. Q& @                        else{  {& @, J& e6 ]8 ^" ]6 K; j
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    $ R7 E9 @3 l: u9 P% n8 H                                pFW2t_1<-pFW2;+ T2 N; `, T3 }3 s
                            }9 p9 k; I/ \" U9 F
                            B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连' g* N( U- q4 j: p
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导+ _. p  n; H: ^3 R8 |* S
                            if(t==1) w<-w-0.5*epsilon*pFW10 k, [5 |' ?: h( J7 A
                            else{5 H+ ~% [- d3 N3 x) d8 k' {" ~. n
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);, i* f9 ]# f; w
                                    pFW1t_1<-pFW1;
    # p" l- W& R! `) d, N: {                        }
    4 E" `5 U) I9 X  H) S5 F/ o+ M; l                }" [5 B! e- T# D8 w6 P
                    N<-N+1;' ~# ~/ S8 H% [; _
                    ei[N]<-FW/J;
    9 {4 Z: T8 {4 X* U6 O        }
    ; ]2 u. W3 D; e! z: p# b        theta<-w[nrow(w),];#隐含层阈值
    3 Y( J# P6 Z. a( ]0 m# m2 M3 f* r3 `        gama<-v[length(v)];#输出层阈值8 o# G3 ?9 b4 g0 x: Z! Y+ n
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重1 s) H' R- Z0 W! z+ {
            v<-v[1length(v)-1)];#隐含层对输出层的权重
    0 k, q$ k" y% X! M' W4 D        list(theta,gama,w,v,N,FW/J,ei)0 I/ J1 ~+ W4 q2 j: q/ i. i( V
    }
    # M2 a' k& N2 Yx<-cbind(x1,x2,x3,x4,x5,x6,x7);' J/ t5 J4 U$ n) `  D, R* f
    x<-t(x);- `: `9 D$ t" m' L; u* j
    hidden_threshold<-runif(11);' u9 ~! }4 c% Y+ F$ K% J1 n
    output_threshold<-runif(1);
    + G. ^9 R" g) N1 xw<-matrix(runif(77),7,11);
    8 @) l  W; s0 h. f) f( \2 ^v<-runif(11);
    8 }! Y, [8 Y+ v1 Y5 f. wresult<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    + c1 a- `/ d' i: Q- P" s* y2 E#输出
    . }8 S3 S$ E; O2 Pcat("\n");
    ; c2 {% ^) I3 \5 x8 g" l0 t$ Hcat("隐含层阈值theta","\n",result[[1]],"\n");$ M' Y* ], b: o
    cat("输出层阈值gama","\n",result[[2]],"\n");
    4 }9 y% y6 r' S/ Q5 Cw<-as.matrix(result[[3]],7,11);. W/ P' U; p7 ^- B1 ^
    cat("输入层对隐含层的权重w","\n");
    ; U# F( F8 T$ C& O+ d5 nw;5 \* v, @. h" j/ p% z! A0 P/ d6 y
    cat("\n");
    8 H! q4 K' ~% H3 fcat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    * c' ]2 ?" a, l% B7 N' I+ D* Jcat("迭代次数N" ,"\n",result[[5]],"\n");# U- r* A! d* b8 a: Y% q
    cat("学习误差FW","\n",result[[6]],"\n");* z! m- z( ?0 A0 t0 j; N7 N5 i1 m5 ]
    cat("每次迭代的误差","\n");1 Z0 g+ G( J& {; A- ]2 k
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    4 s7 L6 A! N3 I+ @) l( p4 Aproc.time()-ti
    - O% E+ x- R3 o- s# _. Y& y$ F
    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达人

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-31 15:49 , Processed in 0.424169 second(s), 79 queries .

    回顶部