QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18795|回复: 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()
    6 ~! W8 Q  h4 {BP_one_output<-function(input,output,m,fth,sth,w,v){  I  N6 W& o& }
            x<-input;#7*8
    ' {! S2 ~3 l4 _' v( `        y<-output;#8*1,y为向量,每一元素为一个样本输出值" @4 I+ ]& O; A) g" u. i0 M! a, P
            theta<-fth;#11*1
      Z+ z: y( L; s, a% X& `        gama<-sth;#标量0 [* @- Y/ T# q/ z
            if(m!=length(theta)) print("阈值长度错误!")
    # i8 ?0 n7 z. U3 m- @  L0 F        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重; w1 c0 B# Y: {  O
            K<-nrow(x);#8一组样本的维数+ O& o! s) v5 u( m# U
            J<-ncol(x);#8一共有多少组样本9 |8 y) ]3 q; `% ], Z$ ~
            w<-rbind(w,t(theta));#由7*11变为8*11
    8 K: I4 T4 Z  `. m3 _% g        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接3 I' p* n: }; l+ _# @
    #定义函数f' X$ x' ~( n0 g& @6 n! ^
            f<-function(h) 1/(1+exp(-h));5 N; v8 ^& ]* A+ @" y9 t$ \. C
            epsilon<-alpha<-0.5;
    5 m% b% K7 l, g) j5 q9 K2 d* j        N<-0;#重复学习次数的计数/ [2 S- W" @! I4 `3 D) m
            ei<-as.numeric();#记录每次迭代的平均残差平方和' L# q6 J; J0 L1 m6 G1 ~9 ?
            FW<-1;/ }- b. M' x2 t! J: [, J& q" k' X
            while((FW/J)>=0.001){: y5 c" F  O7 q2 F# A
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
    , B/ h$ K9 s& I. R, l$ z& \                Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    ' }1 V: q0 _* i* c                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns+ a6 T* M3 k) f+ ?8 V) h
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值1 C2 P* X* b, U( m$ q6 J
                    D<-f(Z2);#向量,每一元素为一组样本的一个输出值, m9 k* v: Y/ l& g$ S
                    b<-y-D;9 ^# l2 ]' H- l. d  L" f
                    #J组样本的学习# L( t$ L6 h4 F+ X4 J  s
                    #向量,输出层对隐含层的权值的偏导
    4 `  f0 y: ~. d! A0 C% q$ a                FW<-pFW2<-pFW2t_1<-0;+ Z% j+ n) u3 m. E
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导5 e& _+ @7 y% R  K! m
                    for(t in 1:J){! _8 |" L5 n- y3 {3 M6 k0 `! I
                            B3<-b[t];
    . C; }5 {4 u4 Z  a  P, M. H* Z) D                        FW<-FW+B3*B3;#标量
    0 o% z+ C2 K% V  S2 V                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量$ C: U8 Y0 V4 H# X
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    2 m) ?9 P3 p& d+ [# ]                        if(t==1) v<-v-0.5*epsilon*pFW2
    $ h, B5 X6 @1 F. Y2 i, x7 |                        else{
    ' V2 ^2 ^9 S5 r/ l" {' G7 m                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    % r" T+ u) v: g3 r# B0 S                                pFW2t_1<-pFW2;
    - ~  S$ l; b" S" i& e" X! L1 |% V                        }
    & ]" e0 Z  @9 ]+ N3 n: |                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
    3 ~7 `1 H7 ]6 z3 w6 w                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    4 n; ?1 E9 G( B+ {5 Y4 r                        if(t==1) w<-w-0.5*epsilon*pFW15 I7 A1 F' L9 j$ j) V; e# D; o. J
                            else{
    6 ^9 ], M. R) g6 l9 V# `1 u                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);) _" H. x; r6 g1 @
                                    pFW1t_1<-pFW1;. \$ ]3 b- ^! _+ H6 v6 ]. P. `
                            }. R! ^5 S* C! |5 ^5 c$ z
                    }
    / l+ V7 U0 n* J8 A6 v5 C                N<-N+1;
    - d% V2 J5 j: n) Q7 ~8 ]5 Z( x                ei[N]<-FW/J;- C: a( Q# y: _, h; N
            }7 w- s+ t  @. C5 Q
            theta<-w[nrow(w),];#隐含层阈值
    7 B0 ]' ?& ^* S& L* ~1 t        gama<-v[length(v)];#输出层阈值" F0 z, k2 h, y8 s' Z
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    4 j, M( W2 f- L        v<-v[1length(v)-1)];#隐含层对输出层的权重
    & c+ ?6 V# g2 D6 ~- s2 m        list(theta,gama,w,v,N,FW/J,ei)4 K& S4 O: _" K5 m9 H) X& h
    }3 Q( f! z  q4 {8 }* q
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);
    : j& C7 a" x6 {$ D3 E  _6 Qx<-t(x);
    9 `. ^" I2 g- ~* l2 h' \hidden_threshold<-runif(11);' Q9 Y) y6 [! I# n/ U+ Q
    output_threshold<-runif(1);
    . a5 L6 u- X: zw<-matrix(runif(77),7,11);
      O7 b0 b  N2 Q3 \v<-runif(11);# d5 |5 c' a% o2 G! q) H2 U( S/ ]$ t
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    $ V1 C; J7 H- T; V( N& m- {# {#输出
    3 @, b7 D; K  Hcat("\n");
    & |, @, \, [3 g# c# Icat("隐含层阈值theta","\n",result[[1]],"\n");  D% z" t  j9 T/ ]3 h8 ^7 r
    cat("输出层阈值gama","\n",result[[2]],"\n");
    3 U; ?3 \& k* M2 R7 pw<-as.matrix(result[[3]],7,11);
    8 _, p& e% y$ scat("输入层对隐含层的权重w","\n");' l3 O% h& J* B8 v! ^
    w;, ~7 ^7 p, H: }2 {
    cat("\n");) e' {" ^, B+ S1 W. @
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    ! J4 V/ k! o; a$ x: v/ ^3 Mcat("迭代次数N" ,"\n",result[[5]],"\n");
    : |7 q. f( x, i  F8 _3 Fcat("学习误差FW","\n",result[[6]],"\n");* @. Y/ i. p' U7 l6 n3 {8 v
    cat("每次迭代的误差","\n");7 z" d+ b! h9 H" Q5 q8 H& S
    plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    6 `) ?! Z7 l1 m% G& `( Vproc.time()-ti8 A6 b' l1 Y3 x
    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-5-28 13:09 , Processed in 0.414084 second(s), 80 queries .

    回顶部