QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 19040|回复: 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 ?# N) p% t" O6 P1 r1 F, sBP_one_output<-function(input,output,m,fth,sth,w,v){
    % a" o& z% s9 q! [2 C        x<-input;#7*80 l7 w2 W/ b( S! d9 @+ [
            y<-output;#8*1,y为向量,每一元素为一个样本输出值
    ) [5 v% [4 a$ p; h3 {        theta<-fth;#11*1
    6 O# ~/ G4 C% q- X        gama<-sth;#标量
    4 b# l2 h0 V/ L8 I; t- k6 @: b        if(m!=length(theta)) print("阈值长度错误!")
    $ W& ^! \0 a8 P( b, Z        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重( K( S! n- R+ _! n! y' D# I
            K<-nrow(x);#8一组样本的维数
    4 I+ h4 r+ @6 S% W0 X        J<-ncol(x);#8一共有多少组样本) r, g" Z, E( N' K# u4 O5 N
            w<-rbind(w,t(theta));#由7*11变为8*11
    . e- O' O3 Q& p5 g- Y0 ~        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    4 O  o+ a$ U  c  }5 [#定义函数f9 A# P+ Y# z* k7 W
            f<-function(h) 1/(1+exp(-h));8 g, h4 u$ N  a+ J: H6 ^
            epsilon<-alpha<-0.5;' E9 a8 z4 ]. o0 ]4 x7 Z* b
            N<-0;#重复学习次数的计数% u) ?: w- Z8 Y& d5 g+ Q6 X- ^% a
            ei<-as.numeric();#记录每次迭代的平均残差平方和
    ' i% f8 U. r& K5 i% ]) K        FW<-1;+ W3 x- u5 ]+ m
            while((FW/J)>=0.001){
    ( a' |/ Z7 M2 [# o                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
    2 u7 G5 n4 ~; Z# [3 Z# p                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    % S9 |0 N0 V, f( P                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns
    7 Y3 F# `& L+ O6 J' H                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    * b0 G- L5 U, R                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    & D" W; [1 ~% v  h6 J( Y9 \                b<-y-D;5 s: E1 T" k# J/ J; X
                    #J组样本的学习  _* P3 F6 y* n  n7 u: n
                    #向量,输出层对隐含层的权值的偏导
    # U# C+ {3 o! k. d1 {# Y; Y                FW<-pFW2<-pFW2t_1<-0;
    " ]1 z- T; j4 Y% z  v                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导' E' @8 ~3 p8 U3 F' J/ ^) i3 ^) F# h; M
                    for(t in 1:J){
    / n  i  G8 Z8 [' c7 c                        B3<-b[t];
    ; E' _: a% R/ X& ]0 S" }* J) ]                        FW<-FW+B3*B3;#标量7 i7 l/ k+ q8 g& W4 b
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量' z) ^8 Z( o( g  k7 H$ o/ t
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    0 a* K* r: i9 v  }# n  q                        if(t==1) v<-v-0.5*epsilon*pFW22 o7 f# \- z' i( v9 n
                            else{
    2 E- O9 V  I) z1 Y: Y/ Z1 D, R' V; d                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    0 |  C0 T) G! ~                                pFW2t_1<-pFW2;
    ! _0 ~0 E; N% F  Y; }: R1 E( F$ h                        }
    " F. W6 ~9 Z: L+ i# h; N; {9 N                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连+ B* s9 V0 c7 N2 e5 S$ o# i
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导, ~$ K8 q4 e/ j
                            if(t==1) w<-w-0.5*epsilon*pFW19 m) U) u( Y: z6 c9 D
                            else{
    # Y2 j4 Z+ f( s3 p( B! n' s" t& W                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    2 c7 Q) E# _2 [$ v) @9 B                                pFW1t_1<-pFW1;3 @  m! d4 e1 [1 U/ A/ i& ?! P) P9 U
                            }! Q, o$ }1 u4 m- ^2 c( n
                    }: d2 U  S$ }; Y
                    N<-N+1;
    3 C9 \* V) M0 w. `0 x2 d* L9 {' i4 q6 L                ei[N]<-FW/J;
    " O3 Z( [- r) l7 }        }+ o& u0 ~  N, ^$ i. l, |& q/ v0 R
            theta<-w[nrow(w),];#隐含层阈值
    & q; z, y1 w. q  }' `        gama<-v[length(v)];#输出层阈值3 Z8 Y# `& E0 p; w# L) e
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    / W# Q+ H1 e5 Q6 [- n        v<-v[1length(v)-1)];#隐含层对输出层的权重, r# `$ B0 h5 E  K
            list(theta,gama,w,v,N,FW/J,ei)8 n/ k. i! G* Z
    }
    5 z- T7 O; Q( G7 Ix<-cbind(x1,x2,x3,x4,x5,x6,x7);' X( ]3 i5 U3 B! D3 @7 u* z
    x<-t(x);; c6 g0 A6 ?, A% @* ], T- ?/ [
    hidden_threshold<-runif(11);
      I: v. `- @  K. E6 b; N! m! koutput_threshold<-runif(1);, u' E. P4 q5 @) t6 L' W  k
    w<-matrix(runif(77),7,11);
    ( _' L; a$ f; O% y. D' J' _v<-runif(11);
    / i$ X% m4 P  ~( d' z" l$ j: {. w+ qresult<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);% B9 f7 d1 ?/ @# I2 }
    #输出0 g% l5 H7 d) X( f
    cat("\n");
    3 \- J  Z, F# ^8 W% lcat("隐含层阈值theta","\n",result[[1]],"\n");7 t1 a+ r$ i4 q8 W8 L6 S/ g
    cat("输出层阈值gama","\n",result[[2]],"\n");
    2 h* K' h4 M, E8 i$ V% f' J6 ww<-as.matrix(result[[3]],7,11);3 }2 q+ V7 @: X, Q' Z& @4 D0 D
    cat("输入层对隐含层的权重w","\n");: Q% X" i# `( c% @0 S; v' X
    w;# v$ i1 E0 Q9 O
    cat("\n");
    1 x) ?; k# J: q1 b. _cat("隐含层对输出层的权重v","\n",result[[4]],"\n");6 p& H* M) R% t# l$ F) h" ^$ G; e* y
    cat("迭代次数N" ,"\n",result[[5]],"\n");$ l4 B" W  Z9 o; `8 R7 G8 _% w
    cat("学习误差FW","\n",result[[6]],"\n");
    ' N" e6 i' _9 o# C8 {) @cat("每次迭代的误差","\n");: f! ?" B3 K2 N
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    6 m; S" T$ g8 k2 Z" cproc.time()-ti2 M! W7 N9 ]2 F6 g. ~/ q
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    2

    主题

    9

    听众

    52

    积分

    升级  49.47%

  • TA的每日心情
    开心
    2016-6-22 08:37
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    自我介绍
    多次国赛获奖,研究生数学建模获得国家奖

    社区QQ达人

    回复

    使用道具 举报

    凌chers        

    0

    主题

    4

    听众

    34

    积分

    升级  30.53%

  • TA的每日心情
    衰
    2012-8-30 18:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    群组: 学术交流A

    回复

    使用道具 举报

    黄窗帘        

    0

    主题

    4

    听众

    28

    积分

    升级  24.21%

    该用户从未签到

    回复

    使用道具 举报

    Esmtih        

    0

    主题

    4

    听众

    9

    积分

    升级  4.21%

  • TA的每日心情
    难过
    2011-11-8 08:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    回复

    使用道具 举报

    0

    主题

    4

    听众

    50

    积分

    升级  47.37%

    该用户从未签到

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-10-30 07:51 , Processed in 0.487161 second(s), 80 queries .

    回顶部