QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18879|回复: 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()" T  ?/ l% Z: Q1 s
    BP_one_output<-function(input,output,m,fth,sth,w,v){' }/ f& w. t4 r; `* ^3 E) m
            x<-input;#7*8  L/ Z4 c/ w( x6 D1 Z/ L) M0 `
            y<-output;#8*1,y为向量,每一元素为一个样本输出值
    - \4 o/ @0 Z2 |  E& G        theta<-fth;#11*1- ?7 {1 ^; M& }2 _: n1 q+ E
            gama<-sth;#标量
    5 K, J6 M3 h/ z% v        if(m!=length(theta)) print("阈值长度错误!")! V" Z7 n6 N7 o
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重; N" ^8 t0 x8 @. [! ^$ X
            K<-nrow(x);#8一组样本的维数- W3 b( r' y; f2 c
            J<-ncol(x);#8一共有多少组样本
    : K5 S9 y" K, P        w<-rbind(w,t(theta));#由7*11变为8*11
    1 }% }7 B! k+ k6 T  ^2 [) t& K4 m4 f3 `        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    % ~/ H& q( W: ^9 r4 T#定义函数f2 Z2 I+ H9 R' j9 y4 L
            f<-function(h) 1/(1+exp(-h));
    $ G. q- m/ |/ ]1 \2 M# r        epsilon<-alpha<-0.5;" I- C! K0 s) d2 O' r1 e
            N<-0;#重复学习次数的计数; b: ]& z. C8 x- ~& v" q# P: q) E
            ei<-as.numeric();#记录每次迭代的平均残差平方和( d+ j) d+ z* w8 r  I- U$ a' k
            FW<-1;
    + ]/ G1 s" ~, o' [8 r3 f# x. j- \1 r! m        while((FW/J)>=0.001){
    , D! b; O  c/ ^; n1 i: M8 P8 t$ z! p- d                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本& P2 r$ [; a- D9 F; c
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, ! F7 k9 [- M- b& X( {0 N
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns0 t7 X  t8 z7 @) h
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    4 x7 }- u1 g+ I, X                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    9 O4 {# N/ y' M5 Y- }; D                b<-y-D;2 B/ Y# m+ s5 [7 s5 _
                    #J组样本的学习
    ' X, R+ q9 E) ?$ o- y9 ^                #向量,输出层对隐含层的权值的偏导
    ( P# e6 F$ x. U1 p# [                FW<-pFW2<-pFW2t_1<-0;
    1 B; b1 e1 d  A! n4 p% j8 T                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导  h- E* R5 j* P3 h8 K3 |
                    for(t in 1:J){, u" t- D! J- m  {$ o
                            B3<-b[t];
    ; g1 V; l, W/ U  y% B9 e9 {                        FW<-FW+B3*B3;#标量* ~' e- e( ^! M0 z, z2 E1 M
                            B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
    - _" r; {4 E. S: ~9 j+ g. B# P                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项4 E: B6 N. }! d' M/ b5 b
                            if(t==1) v<-v-0.5*epsilon*pFW2
    ( \1 E0 w  |9 W# \& ^6 c! Q                        else{
    5 f8 n% P# m4 [0 H                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);9 V% D: C- J% b; q4 Y
                                    pFW2t_1<-pFW2;
    ' n, }2 p, J1 ^: t* V$ t                        }
    7 c3 m* p. ]* h9 {* w# @* i                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连8 f  t! a7 o! a8 o
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    4 u  m1 @4 l, D, t" K; o5 g                        if(t==1) w<-w-0.5*epsilon*pFW1
    ! ]; D+ N% x8 `4 ?* Z                        else{
    / u$ `: z2 O. X& O                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);0 r' m0 _0 r  v8 D0 J5 l
                                    pFW1t_1<-pFW1;
    / C9 L! v* O5 O# Q, }                        }
    ! m4 u1 P( K6 P                }, Y: h* c7 \) O1 \
                    N<-N+1;
    % m! D/ p( L5 i% c                ei[N]<-FW/J;7 _% _9 B4 F4 W1 H" O1 u% K. C0 P4 e
            }% n' |0 ^9 Q  ?
            theta<-w[nrow(w),];#隐含层阈值
    - s3 V0 ^* N1 h        gama<-v[length(v)];#输出层阈值
    , h+ y7 U/ a7 n% X* P        w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    5 H* ?0 h( K5 g7 a+ N! o        v<-v[1length(v)-1)];#隐含层对输出层的权重
    7 m9 Z) K. q4 \2 m& X        list(theta,gama,w,v,N,FW/J,ei)# m8 X. q7 {- ~9 ]8 f8 g( Q$ k
    }
    / I' V3 S% b1 g5 v1 b) f# vx<-cbind(x1,x2,x3,x4,x5,x6,x7);! W& m' P( a  r- k# c* ^( a$ p
    x<-t(x);
    , _1 U+ _$ P6 i9 h6 k4 bhidden_threshold<-runif(11);
    " C& m# [1 J7 }2 c4 H( ]7 \9 soutput_threshold<-runif(1);
    " }% m2 @+ i$ s: V  Sw<-matrix(runif(77),7,11);* |; Z$ ?  f% h
    v<-runif(11);
    9 v; @" M/ x" d5 i! F+ {result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);( s0 k( f. K5 n+ k: m" e' P3 q, A) A
    #输出" Y/ K! P, }' ]9 h+ Q- f2 z
    cat("\n");! [, H! H4 [% R6 m# A" P
    cat("隐含层阈值theta","\n",result[[1]],"\n");
    9 j- p- O3 J3 v, pcat("输出层阈值gama","\n",result[[2]],"\n");
    7 }1 J  W4 C  h9 \8 r: ^- yw<-as.matrix(result[[3]],7,11);
    ; R/ T$ H2 O) y4 Acat("输入层对隐含层的权重w","\n");
    " A/ `9 O; f9 `6 U, O' dw;
    5 j# s+ W3 {8 q+ |. M# V5 wcat("\n");
    5 n& k3 z4 j! O) g4 W. x- ^: s1 Tcat("隐含层对输出层的权重v","\n",result[[4]],"\n");3 q7 L5 F) _& i3 P
    cat("迭代次数N" ,"\n",result[[5]],"\n");4 I; p4 C4 `6 z  d7 S
    cat("学习误差FW","\n",result[[6]],"\n");) w* t1 d& d; p/ p. v, U
    cat("每次迭代的误差","\n");) c" ?4 O2 A, V( N
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    % W7 z: G1 ?: f  Xproc.time()-ti* P# O5 |, l0 B* U" e
    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-8-25 23:34 , Processed in 0.571421 second(s), 80 queries .

    回顶部