QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 19011|回复: 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()" e! V3 c: D2 _4 o
    BP_one_output<-function(input,output,m,fth,sth,w,v){
    6 y# @5 A9 t* u9 J        x<-input;#7*8* e8 a! G: d; k+ O/ ^, d; U
            y<-output;#8*1,y为向量,每一元素为一个样本输出值7 Y( U4 r! l9 q0 h2 G$ g
            theta<-fth;#11*1( L5 Z5 v! L8 {( h  ?3 J
            gama<-sth;#标量
    " W( Q0 C& s  O$ Z" I* {, D' }        if(m!=length(theta)) print("阈值长度错误!")/ p! E$ U  H! a
            x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重$ a8 j' |9 ~8 o6 m2 \$ }; d
            K<-nrow(x);#8一组样本的维数- f& z9 q) \  b" s# I* M' X+ x
            J<-ncol(x);#8一共有多少组样本- _+ j; r9 C/ [2 ]& r
            w<-rbind(w,t(theta));#由7*11变为8*11
    . P8 Y1 e& S! U7 ?; U        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    3 W9 n: s; [4 q$ @0 z4 }#定义函数f# w5 y1 N5 E' p& ~+ _
            f<-function(h) 1/(1+exp(-h));
    ; i# I( C3 Q& O! W        epsilon<-alpha<-0.5;- P6 s0 M/ K: f& r/ b" a- t# r
            N<-0;#重复学习次数的计数
    - t5 A3 p) L5 ]0 @$ E/ ]) r0 y  T        ei<-as.numeric();#记录每次迭代的平均残差平方和4 D, v9 K! _! o5 d6 r5 l/ }2 @( K0 z
            FW<-1;7 D% W$ g. j  S% W1 a, _$ [; c; |( |
            while((FW/J)>=0.001){# k; [( p, S; t! U7 q) Y! ~; @) a! V
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本3 h6 q/ F3 J- S* @4 n
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows, " Y* E; S$ v0 U" @  d6 B
                                                                                            #2 indicates columns, c(1, 2) indicates rows and columns5 R, C; ?6 b1 O4 B5 `. ]! W' c
                    Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值' r+ a8 Q) K" F
                    D<-f(Z2);#向量,每一元素为一组样本的一个输出值" P! N3 A& H) n0 l3 M6 ]$ Q2 j
                    b<-y-D;) `$ W/ G* X  s6 C. f
                    #J组样本的学习( v! S6 d2 `" X( e6 Q6 y
                    #向量,输出层对隐含层的权值的偏导
    - _% G/ F/ x# a  f$ |7 e  a7 ]/ x                FW<-pFW2<-pFW2t_1<-0;
    , L- I+ F% c: f% @6 |% w                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导% w6 B) r( _' Y- i- _2 v& ^+ ~
                    for(t in 1:J){
    0 d3 Q3 W! W: K  Y: x                        B3<-b[t];
    8 T) q% ]- y" N& j                        FW<-FW+B3*B3;#标量
    8 l5 t' b- v! {3 c' d                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量9 _# e% i8 ]7 e, C; F
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项* I% z# c* u! s* W
                            if(t==1) v<-v-0.5*epsilon*pFW2
    . z2 N& t* l4 Q6 x                        else{4 C2 \: \7 c5 u" ]2 Y3 ^7 H
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    8 F4 `) x- w. r; W2 L                                pFW2t_1<-pFW2;8 G/ {5 \0 L  ^( N. T
                            }$ H4 o7 f; g1 E+ T& j9 ^" K# f8 R
                            B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连6 i9 w3 J: V5 H( ~0 `1 n" g
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    ) v3 ]; n% L( }* t5 A: S3 R3 @                        if(t==1) w<-w-0.5*epsilon*pFW1& ]: \5 ?7 w0 o- E9 U" i
                            else{; Z, f+ W  i8 t/ s4 H$ k8 e
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);/ R0 R, N; j6 e/ n* n) a
                                    pFW1t_1<-pFW1;, P6 k- \  Q' ^0 Y
                            }
    2 h3 t; f' T8 L* A* w2 x' i7 d                }
    ) D7 F5 }9 G3 t" q" J                N<-N+1;( m4 T& {  S$ D+ k, }8 w. {
                    ei[N]<-FW/J;
    " d3 ~* X( ~2 v        }
    9 V( \5 T( r+ z( K3 t5 X        theta<-w[nrow(w),];#隐含层阈值
    5 d' R- @) p" |; n# ?- M& `4 I        gama<-v[length(v)];#输出层阈值
    0 h( t( g$ R' n% }3 m' u; ~        w<-w[1nrow(w)-1),];#输入层对隐含层的权重# T0 t. t$ s: N: q" {
            v<-v[1length(v)-1)];#隐含层对输出层的权重4 p$ j2 d/ m& [( v! x! n3 A
            list(theta,gama,w,v,N,FW/J,ei)- _; L0 M3 z/ L2 |+ }7 u$ L
    }
    7 e, X- z! M2 h+ L7 Bx<-cbind(x1,x2,x3,x4,x5,x6,x7);8 b( d/ S1 d+ e, N! p/ L1 b! V
    x<-t(x);1 i. _- `* Q( n4 P, z8 c( `5 s
    hidden_threshold<-runif(11);, B  t" X* _! f7 l( `7 L
    output_threshold<-runif(1);* u" v1 _; ]7 m6 `
    w<-matrix(runif(77),7,11);
    / L/ Z( r0 d: X, k9 Zv<-runif(11);6 }6 g. @8 P3 c
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);/ Q& p. Q6 \8 C; a! V
    #输出
    ; h9 c1 q& g: |. W- v4 Z+ zcat("\n");- [. A/ ~, ^- c
    cat("隐含层阈值theta","\n",result[[1]],"\n");
    ( H* @0 P- S5 p% d; ycat("输出层阈值gama","\n",result[[2]],"\n");3 y0 g% N" \* X; V( C9 n1 A
    w<-as.matrix(result[[3]],7,11);
    - `% Z/ N( {! v: f6 ]6 L0 b* Lcat("输入层对隐含层的权重w","\n");
    # G2 s5 c2 p$ I) a, L7 i* zw;
    4 ~- ^/ b! J# l/ m5 e1 F$ r/ V  Jcat("\n");1 x/ ^8 e, f0 S% V; [
    cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    6 c4 R7 b+ B) v9 I( L- W' Mcat("迭代次数N" ,"\n",result[[5]],"\n");4 ^: _1 n3 o, s3 B8 `
    cat("学习误差FW","\n",result[[6]],"\n");; W$ ?4 a! I, F0 J: f/ R* w; s
    cat("每次迭代的误差","\n");
    9 F# x# B; V4 j* m; z$ p. Pplot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");' H$ Q  D- w: v  ?, U+ O* y& g
    proc.time()-ti3 @1 x5 C  ~' O1 I, i7 \
    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 00:35 , Processed in 2.139207 second(s), 79 queries .

    回顶部