QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18460|回复: 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 O5 Q  d! T" U( Q2 _5 \) r. m9 R1 s; `
    BP_one_output<-function(input,output,m,fth,sth,w,v){" z4 z' S2 b* U( z3 `3 @8 h/ I
            x<-input;#7*8
    5 e; ]5 p& |6 u" R8 }        y<-output;#8*1,y为向量,每一元素为一个样本输出值6 N) ~  R# G" d5 l& _# S
            theta<-fth;#11*1
    3 k% K8 I( W6 ]7 o( e        gama<-sth;#标量
    ) {4 q) o6 Y5 L& h4 d5 v        if(m!=length(theta)) print("阈值长度错误!")0 P" v- e# C1 n  N
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重, h+ e+ G5 R) F
            K<-nrow(x);#8一组样本的维数
    9 M+ C4 R% v( r' p5 B        J<-ncol(x);#8一共有多少组样本
    3 E- _! K" p% P8 x! ^* G  ^& Q        w<-rbind(w,t(theta));#由7*11变为8*11
    $ {% Y! [9 k  }- W        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    " e! F2 s8 \& y#定义函数f
    " X$ ~6 x/ X8 X) S1 e        f<-function(h) 1/(1+exp(-h));' K8 d/ Q0 z. H" H/ N
            epsilon<-alpha<-0.5;& j; z2 S, E! A/ H6 ]- D3 E
            N<-0;#重复学习次数的计数
    3 w2 {% u2 f/ Y+ s        ei<-as.numeric();#记录每次迭代的平均残差平方和
    . t3 I5 m- H* T7 j% l  y& {        FW<-1;1 q* p/ |; j. [) V1 Y
            while((FW/J)>=0.001){
    5 a# i, G& z# V0 p' [$ @0 [                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本( z+ r. Z/ p1 B" P* h
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    " P. M- m% J" P( d* @0 p+ T                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns: |9 M8 {+ A) I" F
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值7 R; p2 K' E' f( ^4 f! U) m! T
                    D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    ! S/ ~# S. M" k                b<-y-D;- e/ {# p. n$ E, `, ^
                    #J组样本的学习
    : L- ?( z5 ?, j9 _7 J                #向量,输出层对隐含层的权值的偏导. f) u8 d. w6 N2 w
                    FW<-pFW2<-pFW2t_1<-0;
    8 h+ D) g2 A9 i7 X+ _6 U                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导) s7 L1 t0 Y9 I9 R% a; K
                    for(t in 1:J){" [  \3 O5 P( n8 |! c; Z4 T( o. |2 }
                            B3<-b[t];; _' z! L2 e9 P3 ^" B. Z
                            FW<-FW+B3*B3;#标量
    - A: \/ V3 x+ H/ f# v. _" ~5 C) B                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
    ' F2 \, q1 h2 O5 K                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    % x  i5 h7 d0 d; l( U5 x# @4 y9 l                        if(t==1) v<-v-0.5*epsilon*pFW2, k9 x: }" |5 D; M6 J1 `" m9 s. g
                            else{- I  v6 m+ O& P
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    + J' u: c: Y/ q3 \1 M                                pFW2t_1<-pFW2;
    2 w* b6 r* P* z8 r% {                        }; Y7 L* t  O% x8 X5 I" x. B# }
                            B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
    8 f# I9 h1 T* j5 c! M: z: {- ]) ~                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    1 y; T' o) S% P& d8 k! f                        if(t==1) w<-w-0.5*epsilon*pFW1$ e' f4 A7 d( }7 F0 @- V
                            else{+ s: g* N& x) |' f7 D8 H
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    % w6 d  X  n0 u( D4 S: r# I                                pFW1t_1<-pFW1;" L0 o$ F2 Y! p7 `: Y
                            }# ^, K2 Q5 D! r7 o; I# _
                    }1 ^4 c9 z$ t( s/ G$ b, h
                    N<-N+1;) n8 q1 j4 C* ]& e8 X' t) n5 D
                    ei[N]<-FW/J;
    4 m' P# ^6 G* S% B) o        }6 |' C7 @% U5 d; r! M
            theta<-w[nrow(w),];#隐含层阈值* P" }* Z' h& t5 K/ @7 y, P1 q
            gama<-v[length(v)];#输出层阈值
    * @; W8 p; b# Z( ]% `: Y        w<-w[1nrow(w)-1),];#输入层对隐含层的权重. y! z! ]9 D" `! U
            v<-v[1length(v)-1)];#隐含层对输出层的权重
    8 l; h3 w- ^4 x! C) N) T2 u" i; K        list(theta,gama,w,v,N,FW/J,ei)7 n. r* x6 U( w, A" d" d
    }
    9 }! \7 ^/ S, Z% F- ]- Fx<-cbind(x1,x2,x3,x4,x5,x6,x7);
    % f3 O- q3 d9 p' u4 Zx<-t(x);
    ' U4 L& M# E- _& f- rhidden_threshold<-runif(11);" s. c( I. k) f
    output_threshold<-runif(1);: Z2 u0 H0 l: h# \+ Y3 J( C; T
    w<-matrix(runif(77),7,11);
    . I' r. B, }1 N1 Mv<-runif(11);  l) T7 ^/ E  Y. Q
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);" m7 g0 ~* H9 M8 U( t$ V- n# u9 F
    #输出
    : H! x& u% E8 r2 i+ Kcat("\n");
    6 V" p  d% S  h; a9 y- C" T2 jcat("隐含层阈值theta","\n",result[[1]],"\n");: P( q, P. T( [
    cat("输出层阈值gama","\n",result[[2]],"\n");- ^8 P( Q0 P. X6 }% ]; }
    w<-as.matrix(result[[3]],7,11);: g( M) T$ l/ P) x' S; X9 {3 K0 x
    cat("输入层对隐含层的权重w","\n");' `* H7 W! q6 d" U
    w;
    8 l* P% l; d( t" H6 {/ R$ Ncat("\n");' I+ {% a( G8 W- k& W$ K6 N$ K
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    / q, \& B, O$ F. y2 j3 wcat("迭代次数N" ,"\n",result[[5]],"\n");: a/ {: O, `/ B( P
    cat("学习误差FW","\n",result[[6]],"\n");
    : V" L5 t. J; Hcat("每次迭代的误差","\n");. r* B$ {/ ]. N6 j; q2 d( b. e
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    - R5 H* ~3 ^* N- B0 q* rproc.time()-ti, [: G) n0 A$ _: G
    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, 2025-7-29 07:10 , Processed in 0.528603 second(s), 79 queries .

    回顶部