QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 18878|回复: 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) ?# t' n; A9 |: x, ?. r9 WBP_one_output<-function(input,output,m,fth,sth,w,v){
    - ^, }' R7 o: s- q6 j7 s        x<-input;#7*8- L6 H. Z, b& J4 g' Z( o
            y<-output;#8*1,y为向量,每一元素为一个样本输出值
    $ L- ^& N5 g& l. W/ h* a        theta<-fth;#11*1
    / S2 P( P2 l9 u  \; y2 b! W        gama<-sth;#标量
    ) l0 a& s9 T$ f: [4 `* {- ^0 x        if(m!=length(theta)) print("阈值长度错误!")
    6 m9 A8 E8 C5 Y: j3 Y; L        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重9 C& y& l* f- w
            K<-nrow(x);#8一组样本的维数
    * c; v! `& }9 \" l/ _4 Z) {( h        J<-ncol(x);#8一共有多少组样本
    0 s3 Q" T; ]9 Q& f        w<-rbind(w,t(theta));#由7*11变为8*11
    ) ~  N2 Q$ D$ z' Z$ W/ C. i& x        v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
    : j$ Z1 X! M5 p#定义函数f
    / t0 H) q! _: n        f<-function(h) 1/(1+exp(-h));' ?$ N0 v/ t4 l7 D! k( @4 @
            epsilon<-alpha<-0.5;' l( C' x8 z$ F5 |
            N<-0;#重复学习次数的计数
    * U5 l9 i: R3 h" |$ S        ei<-as.numeric();#记录每次迭代的平均残差平方和" w6 I0 D* Y9 ~9 L- R( _
            FW<-1;/ u# K: q4 m# `5 d% @
            while((FW/J)>=0.001){' \4 f/ j2 {- s
                    Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本7 w- V$ x) w% n/ L
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    - C7 L% @' c7 L" B                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns
    # G9 w$ W4 m1 a! {0 Z' G# \                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值( W) \3 X* A- {/ L$ U5 f  U8 z
                    D<-f(Z2);#向量,每一元素为一组样本的一个输出值: E& Q8 i, f" j" H7 X' n$ {% F, R
                    b<-y-D;
    7 y& L# p# }# Z+ ^& `                #J组样本的学习
    + F: A4 X5 q+ o; t9 u  Q6 x                #向量,输出层对隐含层的权值的偏导& v5 `: k! S! b1 s5 ?
                    FW<-pFW2<-pFW2t_1<-0;
    ! Z# J& j4 V5 B6 a0 a                pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导; q4 V9 W. c& g+ {; n; z' u8 J4 l3 [  p
                    for(t in 1:J){* N0 s4 ~* j; I* H: X. g& M1 H
                            B3<-b[t];% E- S; W4 G+ P, g+ G
                            FW<-FW+B3*B3;#标量
    5 f5 e( t, I% N. o% t; ~3 P& L1 V                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
    - H; g6 D0 Z5 b% e! y+ r9 S4 a) P* d                        pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    . O5 V- x3 k* F$ n& o% G: N                        if(t==1) v<-v-0.5*epsilon*pFW26 j7 \/ F# z' O, v- ?
                            else{
    : R6 N6 ?: N" A" ?$ [                                v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);2 \+ I0 Y: Y$ A* v
                                    pFW2t_1<-pFW2;% f/ {" r+ X7 B5 O6 t' z1 K
                            }
    & |) A! w2 j# L* `2 E1 R) B; t                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
    + Z' z* D1 o9 J5 p+ Z3 V                        pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导2 r9 g, A6 V6 h6 d7 J5 u
                            if(t==1) w<-w-0.5*epsilon*pFW1; T" @2 J3 R; d, l& F
                            else{9 |2 K3 ]7 K2 c+ j5 |" r( F
                                    w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);3 Z' X2 E7 a2 S1 l- a" U
                                    pFW1t_1<-pFW1;9 h4 L. I/ x2 e! i
                            }
    , I8 l( R$ \1 \/ y: M+ i* U7 A                }$ O! z/ t+ e1 z7 K9 Y9 ?
                    N<-N+1;5 z5 y2 v1 y( z& m
                    ei[N]<-FW/J;
    ( Z- a4 X6 @. a+ y, n        }* D2 b; ^' Z  {: k( h6 U
            theta<-w[nrow(w),];#隐含层阈值
    ; }% W. h) N+ W" K% y        gama<-v[length(v)];#输出层阈值
    $ }" g. l- M  N% n# D2 [% A        w<-w[1nrow(w)-1),];#输入层对隐含层的权重
    # [7 S5 H9 ]* f) u, U5 @: M        v<-v[1length(v)-1)];#隐含层对输出层的权重* f) X8 ~) O( N# a9 H
            list(theta,gama,w,v,N,FW/J,ei)
    " k3 ?7 \$ Q# q% ~}( c& f' U) S( T/ x: d; l
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);
    , K' `1 W7 y- w: L$ ~x<-t(x);
    " @$ m4 W3 C: m+ Y- Lhidden_threshold<-runif(11);
    : S7 N) g5 e5 T% t$ @0 Y# Qoutput_threshold<-runif(1);( c! A7 R, ?1 [% ^* K6 V
    w<-matrix(runif(77),7,11);
    , c% n6 a4 `! `( y+ e; @v<-runif(11);
    , F' J1 w3 l* u7 l, V8 T4 S0 Nresult<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);2 N6 K; Y7 `9 \1 H; T
    #输出9 L& ]% y  `. a
    cat("\n");' p5 X4 T2 |- E& C- I
    cat("隐含层阈值theta","\n",result[[1]],"\n");1 @' q( L5 ^9 Z2 `' D- |9 i
    cat("输出层阈值gama","\n",result[[2]],"\n");. s9 f9 l, ]" l6 G
    w<-as.matrix(result[[3]],7,11);$ B, |0 b; Q0 j
    cat("输入层对隐含层的权重w","\n");
    ! y7 D: m. `; M; b" Fw;
    0 R6 K6 e. M+ \! rcat("\n");
    $ }: U. @' E" c0 z. H5 ]cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
    # R( [# ]+ x6 w" r! icat("迭代次数N" ,"\n",result[[5]],"\n");4 `' c1 }; }' o3 o  H4 x- P. C
    cat("学习误差FW","\n",result[[6]],"\n");$ [, }2 z+ ?" r
    cat("每次迭代的误差","\n");
    ' B! v3 T+ k- q. {( M& Aplot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    : y" n7 O8 R7 ?- l' V' T% qproc.time()-ti6 W4 t1 l& w" h; 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-8-25 22:24 , Processed in 0.909481 second(s), 79 queries .

    回顶部