QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 19015|回复: 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()
    0 D' |# f; K+ N& ?9 A2 L2 oBP_one_output<-function(input,output,m,fth,sth,w,v){
    2 {" F. C3 s1 D' u8 e' F8 g        x<-input;#7*8: j2 b4 y& T+ _% J$ t$ ~' z
            y<-output;#8*1,y为向量,每一元素为一个样本输出值
    0 X& n7 q0 ~* P0 B1 Y        theta<-fth;#11*1, K+ U: d5 p+ X; h) y; A4 c, A4 u
            gama<-sth;#标量
    4 A. w6 l  W" I3 E8 h9 {& D$ ^( u) K        if(m!=length(theta)) print("阈值长度错误!")
    5 A4 }2 h6 K3 x3 m5 x- H2 i: W        x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
    0 k* a" l% t5 C& u3 }2 a5 b        K<-nrow(x);#8一组样本的维数( T3 d% y7 T, c
            J<-ncol(x);#8一共有多少组样本
    0 a: j) F! T0 y5 @5 i2 b, p        w<-rbind(w,t(theta));#由7*11变为8*11' l3 a+ Y: x+ D
            v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接2 d+ N" M* y$ }/ N
    #定义函数f
    # K2 S; e- O* T  G# j0 ?        f<-function(h) 1/(1+exp(-h));
    7 t# E5 `' D! G) `8 L$ S3 P        epsilon<-alpha<-0.5;' Q0 t3 d8 E0 \3 N; c& D' Y
            N<-0;#重复学习次数的计数' P8 k$ p# r1 O5 j4 N$ ?$ S: n
            ei<-as.numeric();#记录每次迭代的平均残差平方和
    ' F( R7 t7 N! V) @% s' k        FW<-1;. |" x, C$ u6 Z! v" f$ R4 k. h
            while((FW/J)>=0.001){
    3 L/ V( {  S/ m# P: f                Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本5 ]& O3 R$ ^- q; J9 y- C3 E4 q
                    Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
    ! [0 Z$ n2 B6 [' T% i                                                                                        #2 indicates columns, c(1, 2) indicates rows and columns
    ) M# i1 d: T/ ]$ p$ ]' f                Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
    6 g4 T8 Q6 Y/ D% V  e6 _5 {6 F                D<-f(Z2);#向量,每一元素为一组样本的一个输出值
    , @/ c; I/ g( O, [6 a7 X) b                b<-y-D;0 Q- e# m4 g$ T: K# C
                    #J组样本的学习
    # `; O8 ]! |% y) N# V, V$ s5 B                #向量,输出层对隐含层的权值的偏导, t  `8 F1 X5 x4 U1 P1 v
                    FW<-pFW2<-pFW2t_1<-0;, ~( G# @  s5 J& m4 L7 D6 X
                    pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
    ( F' r6 x1 d/ {8 b* M                for(t in 1:J){8 C) \. z; F9 n* U  V
                            B3<-b[t];# ?$ g/ O$ {  Y3 z
                            FW<-FW+B3*B3;#标量
    / L& E5 U' t5 g1 R% c8 t                        B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量0 K1 l4 P5 g% z) W
                            pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
    8 _( k  C( N& N+ j                        if(t==1) v<-v-0.5*epsilon*pFW2
    % f$ G+ z: {4 ~$ o! b                        else{' t) z- K/ k. ]- K4 c: t7 \: ]
                                    v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
    & F9 z; H2 \2 E& K; I' D  l                                pFW2t_1<-pFW2;
    / M! M* H6 J" Q* w                        }
    " e3 [2 }2 f4 m: ?0 q7 O- j                        B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连4 M8 m8 e/ N% Z, P% P' A
                            pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
    ( }5 ], a: T( e& D1 F                        if(t==1) w<-w-0.5*epsilon*pFW1  f7 T3 P  }* a3 k5 Q% Y
                            else{
    . N# t- c) c# q. S                                w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
    8 r) `0 x: q2 _" L" k8 S                                pFW1t_1<-pFW1;
    ) {$ Z) g* Y# _. h5 I3 a) p& ^                        }
    ; l0 ~0 ~& j& }7 _/ e                }
    ; B6 o4 H* F/ V                N<-N+1;5 f; G( Y; F$ J7 X
                    ei[N]<-FW/J;& a2 |+ @6 ]8 q2 N% s
            }; h0 N* V) E9 b9 k. w. x( W
            theta<-w[nrow(w),];#隐含层阈值
    ' j0 L/ t+ S/ M' D6 U& c* R        gama<-v[length(v)];#输出层阈值5 r6 Q# a: C+ I: |- [4 E& |9 l( g
            w<-w[1nrow(w)-1),];#输入层对隐含层的权重! j$ y( x( [3 Z& R1 M1 X1 w& E
            v<-v[1length(v)-1)];#隐含层对输出层的权重$ j6 ]( M4 D, A& V# `+ J
            list(theta,gama,w,v,N,FW/J,ei)& B. F% ~& L8 R2 ?. J: N! |
    }7 y( l7 |$ R5 F9 }' j
    x<-cbind(x1,x2,x3,x4,x5,x6,x7);. v0 k, A+ \5 N% q6 Y! y% n
    x<-t(x);# W7 U" r( b9 T
    hidden_threshold<-runif(11);# o3 Z2 I6 f+ n$ v7 O
    output_threshold<-runif(1);
    5 i* k, G  p2 d  G) b4 cw<-matrix(runif(77),7,11);& \4 ^  j& R9 P. I1 R5 \
    v<-runif(11);- c$ y2 i! H: u, Q% P
    result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
    0 z& E3 z2 _. M#输出! G: @$ J4 j; D9 |7 J% O
    cat("\n");2 k7 x. V, o) g) ]: k3 \- |- f$ y
    cat("隐含层阈值theta","\n",result[[1]],"\n");
    + }3 I$ `3 q, P5 N2 e$ Vcat("输出层阈值gama","\n",result[[2]],"\n");
    4 T3 Z* b( M5 _6 ]0 V; B9 G) ]w<-as.matrix(result[[3]],7,11);# S8 p5 Z) Z' P# ^. Y
    cat("输入层对隐含层的权重w","\n");
    ; E6 K1 s3 K0 dw;
    ! p' |" q. k& D% R+ z& Gcat("\n");
    8 ^3 z6 K. A) A& D8 ucat("隐含层对输出层的权重v","\n",result[[4]],"\n");/ r7 z2 f1 _* e/ O: u& t
    cat("迭代次数N" ,"\n",result[[5]],"\n");
    $ ^, s+ s! g7 u- Ecat("学习误差FW","\n",result[[6]],"\n");
    ; r; o+ m% C* W4 Icat("每次迭代的误差","\n");
    % Y" n- H- I' i# v1 v% iplot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
    ' l: q/ U, [; N7 uproc.time()-ti
    & |9 t3 W8 W7 A- g; x" z
    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 08:35 , Processed in 2.565736 second(s), 79 queries .

    回顶部