QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 19012|回复: 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()1 G6 S. h, Z4 d1 y
    BP_one_output<-function(input,output,m,fth,sth,w,v){7 _1 d* S" h+ u) P- C
            x<-input;#7*8
    2 N: x+ c* [9 m8 G. C; c, K* \# q% C        y<-output;#8*1,y为向量,每一元素为一个样本输出值
    ! Y- h9 C# M3 U; t6 p9 ^        theta<-fth;#11*1& I( c9 z- G3 \2 F
            gama<-sth;#标量% N/ _7 |4 u: L+ G1 ]
            if(m!=length(theta)) print("阈值长度错误!")+ X" ^9 t/ w5 }/ F' |9 ~
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
    : X8 Q1 P0 o9 u' v8 b% n        K<-nrow(x);#8一组样本的维数
    * v8 X- p- K5 c6 ^" t8 d        J<-ncol(x);#8一共有多少组样本1 S4 o  L1 |% N! @9 _
            w<-rbind(w,t(theta));#由7*11变为8*11
    ' Y' x2 d- }% |# ^        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    ( A' o$ [  Y8 F. O8 h3 E#定义函数f8 o% ~9 s" `6 p; E$ j* s4 O4 O, `
            f<-function(h) 1/(1+exp(-h));
    5 f6 E' e3 q* O, H$ R* y        epsilon<-alpha<-0.5;! B- I4 g& a5 I9 @* R
            N<-0;#重复学习次数的计数1 D4 N# g- X6 A) C7 m
            ei<-as.numeric();#记录每次迭代的平均残差平方和
    / _' P/ s9 |# V+ Q0 x/ l2 W6 h. x        FW<-1;
    4 ^) e- w) m* j" r. ?. ~. U4 u& K        while((FW/J)>=0.001){
    8 b) ]' c; R4 i* t                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
      C9 \" r+ A  e( i" H% ~                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, & l: b- v) h" Y' \$ n2 q% \2 k0 o
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns7 k/ E& G& ?& [: @; m: t- x& S
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    2 y3 D% U5 R+ m& _: }                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    2 A9 y# X. e2 ]3 A" `0 Y                b<-y-D;7 t7 j. j- K6 v5 b4 k, _9 S  R6 g
                    #J组样本的学习5 |  l# P* j" h5 p2 _# ^8 f
                    #向量,输出层对隐含层的权值的偏导8 x" A3 T( w) C) c# Z+ i' o6 }, E
                    FW<-pFW2<-pFW2t_1<-0;
    + P* i. {$ L- j* D  `1 x' S' h. V                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
    0 p0 Y* {. W+ X6 J; M) k# ]. F9 s                for(t in 1:J){+ d) h* e0 v2 m7 F3 x( P5 n! @/ q
                            B3<-b[t];
    7 M6 D2 h$ a, l1 u0 \# b                        FW<-FW+B3*B3;#标量' `! o. n, w. S* U! l6 b1 v  r( K
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
    9 a: e# }1 {/ a$ w% ^2 J                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    : c/ K. G# x% j+ E4 @$ o                        if(t==1) v<-v-0.5*epsilon*pFW2  U/ t( r3 f# u' ?& j
                            else{
    : T2 f0 }  |/ O+ s9 D- f                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
      p& w" h' _* l$ [8 W" l0 p0 w                                pFW2t_1<-pFW2;, f: l) |% E. k  Z' g7 j  ?
                            }9 B0 b$ h& q. S. x2 J* ~0 D1 d, D
                            B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
    ( X! `6 z- q' Z# D( G- }                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    1 h: T; }- `" `- A                        if(t==1) w<-w-0.5*epsilon*pFW1
    " A) e9 p' J2 b* y* e                        else{
    - d* f9 Q+ o3 c% i% [) I8 I                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    : S- x0 i5 R$ `1 k3 y! ]                                pFW1t_1<-pFW1;
    . A- I. \  L, I! M7 D: T; `                        }' ?- T2 |" l' |( Y" V3 {0 W
                    }2 m7 Y# a, m8 q0 f9 b* ?+ u. q, o6 z: N
                    N<-N+1;
    - D+ B5 M6 L" p) t* x                ei[N]<-FW/J;# ]4 L" o, `5 M( V8 p0 g
            }3 W6 l* o2 k9 o" p3 i) t
            theta<-w[nrow(w),];#隐含层阈值
    6 p/ [9 G0 r( X' x6 L+ ?5 y- a9 H        gama<-v[length(v)];#输出层阈值
    ) I7 J5 x5 v* U7 F# r9 N1 r: H        w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    # K7 O0 f  s0 Q1 B        v<-v[1length(v)-1)];#隐含层对输出层的权重: }/ \5 `* m1 `. Q. {
            list(theta,gama,w,v,N,FW/J,ei)
    7 X% S! o  k" V' z( O/ A* a/ J}; Z3 `1 T# h4 T- ?7 h9 P( h
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);0 T4 i7 m7 }$ z2 x6 f. e
    x<-t(x);
    5 O3 k2 E1 [0 q% c8 F" Y* khidden_threshold<-runif(11);
    % f' F* i9 m; I) ~9 goutput_threshold<-runif(1);/ P8 N' h  x' H+ l2 _" m  H
    w<-matrix(runif(77),7,11);8 m9 C0 K* a8 m1 [
    v<-runif(11);( l' ]  X5 t3 ?9 a  _# e1 u. U
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    ) d, t2 [, T( C# |' k2 [& @#输出2 H% S+ L1 a1 T: C
    cat("\n");# z3 V1 \  r% E8 S
    cat("隐含层阈值theta","\n",result[[1]],"\n");
    ' M: J4 M8 l# o! X' ccat("输出层阈值gama","\n",result[[2]],"\n");4 d- F# H5 s/ d; |; ~  g( [! N
    w<-as.matrix(result[[3]],7,11);) d4 P+ D: [  _* C4 q
    cat("输入层对隐含层的权重w","\n");0 F7 F( `: K/ c# {
    w;$ ?( b' S- D- S! {
    cat("\n");/ {1 N% V; U) p. c- I! _' Y  v
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");+ l7 H& ]* [& y5 m. f4 l5 g
    cat("迭代次数N" ,"\n",result[[5]],"\n");% B+ i, s% [3 x8 _' l5 E
    cat("学习误差FW","\n",result[[6]],"\n");  q9 J1 Y/ V$ t( P* j8 f
    cat("每次迭代的误差","\n");/ h1 U4 m& }7 ~, k! w7 e* P( Z
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    8 |5 O' r3 o& ^: T/ f; t2 |/ Oproc.time()-ti
    ! y. M* u3 K7 T2 I5 o
    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-10-26 01:24 , Processed in 0.664536 second(s), 79 queries .

    回顶部