数学建模社区-数学中国

标题: c语言实现BP神经网络算法 [打印本页]

作者: syj52417    时间: 2015-4-24 18:21
标题: c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!
. }, I8 P5 K+ E) j) c% W" mps:不要吐槽语言。我知道这是c c++杂交体。[code=c]#include <stdio.h>
: ^- i! H* m' Q( |4 J* o#include <time.h>. y& U8 w$ ?$ T% U6 H
#include <math.h>0 D2 _  Y$ |' _9 v
#include <stdlib.h>
0 d7 c3 I9 v0 f  v. x8 [5 z! m7 ^#include <iostream>
! w/ `: ^2 a) \8 S$ o- V! A+ xusing namespace std;
, M9 P, g; D! U#define DATA  800' E$ T# V# t( ~# [2 a- m
#define IN 2
( o# [( O) A+ X8 \9 A7 Z# F#define OUT 17 G" f. t8 [/ Y2 \  u( V
#define NEURON 45
7 i( N' K3 w6 v/ ~  F+ S' x#define TRAINC 20000
7 a% X  z" w- D% T
$ o' Y5 P  i, N7 a9 r; _4 S8 s- pdouble Fx(double x)' F; d- c6 M7 i4 T. y
{
$ C, \6 n9 M& B- ]4 s    return 1 / (1 + exp(-1 * x));4 K7 S0 `+ K9 Y5 `5 p1 G5 g
}6 p4 I% }8 Q, F+ {4 U
//La输入层  Lb隐藏层  Lc输出层7 f: [, r4 W. D2 m1 Z7 {: h
//样本输入
( g/ ]/ x4 C; g0 o- ndouble La[DATA][IN];4 k. I# J8 B1 H3 R9 z5 m$ _
//样本输出
( p* {5 Z" k: t% w) idouble Lc[DATA][OUT];8 w" r5 M2 L& X  e7 ?( P
//La->Lb权重1 C7 I# V2 C+ V0 j. \7 R
double Wab[NEURON][IN];
- o0 q. R$ {/ ~7 }//Lb->Lc权重
" |5 Y2 }, @* \. @3 U/ F; U9 Z, H9 C, [double Wbc[OUT][NEURON];! ?0 s0 y$ q. L: h$ L
//样本输入每个向量的最小值,最大值;输出...9 v( ?* t) V; @: N$ a# [
double MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT];+ k1 b3 S$ g4 t
) Z; r+ f# J! _: ]# J
//Lb层输出* l" R& \3 K9 `' d. g
double LbOut[NEURON];* Q  R8 R% u6 h1 [; S. h* U
//Lc层输出& Y5 Z: g2 x, w2 N
double LcOut[OUT];/ \9 f$ U% s0 [) J% U8 G

+ U  E, v+ m3 ^4 m* ~//Lc层单元的一般化误差
8 a; z: U) i9 j& vdouble Dc[OUT];
7 H; V  t; O+ E) A  V//Lb层单元的一般化误差
& A3 J: T; P8 c0 _- H( D  \% a0 [" Hdouble Db[NEURON];- ~& Z# C6 S1 N: {/ H: {) b
7 M& R  Z. f  m' v# `; C' k
//设置样本数据" C& `& v6 J! A
void setSample()! c. Q, |; l6 p1 P5 u7 P7 v$ |
{
' V8 X5 t  Z! U    srand((unsigned)time(NULL));
3 r6 @& u) z" u# Z) Y7 y& C    int i, j;
2 N( Y- g1 M2 a    for (i = 0; i < DATA; i++)  K: g+ x& R: N8 X4 ~3 d* Y  v
    {1 ^7 x0 J* y; `  G+ _! m( l5 [
        for (j = 0; j < IN; j++); {4 J! u6 F  U5 `4 }3 X
        {. ~2 }5 G- G3 O7 X  }
            La[j] = rand() % 1000 / 10.0;
, w* G4 T3 m! Y5 T( _        }
5 N( Z, V8 f( }. Y- F 4 e5 W1 B. U: u: }: _* c
        for (j = 0; j < OUT; j++)& A4 |1 |/ a$ I  O
            Lc[j] = La[0] + La[1];
% f' q. J! o+ v3 `6 H/ v7 p; O    }
) V: D4 E* I6 I) W1 d* P8 ]- ~* h5 D}: T) M7 S8 R9 V- i& @' J! U7 m/ V
//初始化BP网络:权重,阈值(隐含节点+输出节点)
( v5 h) P1 V+ _) \" }void initNet()
" g' E' N! A9 P; K$ j( u$ O: w{
" H6 r0 W; O6 X# m4 t# a) ?    srand((unsigned)time(NULL));6 w1 G" E" x# o5 ~* k! x; N2 Y0 i5 D
    //两部分的权值设置随机值【-1,1】( U) ?$ K. q  z# g5 B, I7 N
    int i, j;* j  n4 \* g/ Q
    for (i = 0; i < NEURON; i++)+ U( y: ^  T. ^; T
        for (j = 0; j < IN; j++)- b% y- J' Z: n3 r" e& M
        {
8 q% L, d! P# K- ~& i. l            Wab[j] = rand()*2.0 / RAND_MAX - 1 ;. t. \  `# Z8 j* k
            Wab[j] /= 20;
' K1 K2 X8 N- ?* U        }
, k1 W8 K, J) c5 |, Y# s; z
- b' D+ y- `' X( o    for (i = 0; i < OUT; i++)
; M% y/ `/ i( o& |+ a3 P% K        for (j = 0; j < NEURON; j++)" M2 @; O4 x/ ?" n" x. \
        {, W' u* x; d5 q  O
            Wbc[j] = rand()*2.0 / RAND_MAX - 1;
- }9 @+ |4 k, h( C" ]            Wbc[j] /= 20;
2 G, w( ^+ |, b1 A7 w! L        }
$ I3 O, {  _- I+ q- C& ^' a$ y     ) p" p! R" G* w9 P8 k
    //找出每个向量最小最大值,并进行归一化
  G7 {. n, O, f    for (i = 0; i < IN; i++)
9 T' w. t, `+ a- e. @    {, _; y; c# f! T7 B. S/ ]1 Q
         
  N7 i4 }$ X* q        MinIn = MaxIn = La[0];
; j+ j, p3 M9 F0 G0 a5 z        for (j = 0; j < DATA; j++)
' c+ f+ s3 O! N, s  x$ x        {4 b4 W; W5 A! Z5 A# M' p
            if (MinIn > La[j])2 I4 k0 C" L# [6 J1 S: h
                MinIn = La[j];9 U' G- h$ ]  e7 h/ D
            if (MaxIn < La[j])+ i, S* I. ?; o5 j5 g" |) D0 \7 X
                MaxIn = La[j];3 C2 M/ p+ V2 K9 N8 K
        }' a. y' o, w  X$ O' s# N+ [8 F! a
     
* }9 W$ g# ]& V1 K9 [. z         * F/ i$ H" R( z4 c6 I  o
    }: N9 e7 F& [+ u/ S

' G5 `/ u1 v. i: G! @* e& p+ [) g/ G; F) e    for (i = 0; i < OUT; i++)
9 h( K( X8 Y1 I5 o7 y* f" t    {" c* a( x3 V$ e, h! y
         
3 E3 B  O7 [: A) W' N, c        MinOut = MaxOut = Lc[0];. b7 }% a3 X9 g" d3 c* O
        for (j = 0; j < DATA; j++)
6 g8 h& k3 M; Y* e1 Z7 o        {
$ H7 ^  F' e" X2 q! j& ^            if (MinOut > Lc[j])5 l- ~. c2 X$ ?4 U7 J
                MinOut = Lc[j];
; s3 a1 O: P* R/ U            if (MaxOut < Lc[j])
- s# O/ l& G; K& n2 J- k( |2 A% o' N                MaxOut = Lc[j];7 g  W3 o+ t% w9 q1 W1 ]: E
        }
; {# r3 e2 T7 W$ p 7 p0 a/ b3 r& C1 B2 K/ o% |8 o
    }$ [- W. o" I& p  ?7 K. }# c/ S5 x

' }- V6 s2 a- l( p" Z) m    //归一化& |6 {5 Q, i1 s
    for (i = 0; i < IN; i++)
. v) h  f' r& U- s# S/ ?        for (j = 0; j < DATA; j++). d# L( B" k! H" [
            La[j] = (La[j] - MinIn + 1) / (MaxIn - MinIn + 1);
: t* G& r& _& c0 m; W. p             - X, A1 V* U2 H* e, n

" H8 s- A5 F2 [* }/ j" g. q    for (i = 0; i < OUT; i++)
, L6 [, U# Y2 R5 Y; B: P        for (j = 0; j < DATA; j++)
/ R  q( D  ?9 d            Lc[j] = (Lc[j] - MinOut + 1) / (MaxOut - MinOut + 1);, ~4 N5 w: J) W% n1 S
         
2 E+ @% o) K% A) H/ R            
+ X' p: E7 C/ ^2 _' `
# Y- r8 K8 G8 i- z- V}) d- T- m" M: e" ~) T5 \
void getActiveVal(int dataIndex)
, B4 t2 S5 J  t/ F6 R2 H{
- L' z& I  P+ q- R    int i, j;( k% k9 t$ m6 f4 E5 A
    double sum;
4 a1 O6 M& `/ m  p6 X" X    for (i = 0; i < NEURON; i++)
; w# z2 k# \4 R: D2 q    {
5 x$ t, h, t. o5 ~( o3 r        sum = 0;
0 Z4 {3 H) A3 y) D        for (j = 0; j < IN; j++)) t2 ?3 Y( E+ C7 v4 S9 @/ V6 H0 ^
            sum += Wab[j] * La[dataIndex][j];
2 T& E9 H" f0 V- M* S         ! U" M8 `- }5 p" U
        LbOut = Fx(sum);9 N6 P  l$ c0 C, n% C" x1 z

5 X  U. w% n/ z8 k- _% k8 |    }) U- x/ Y) f) e/ A6 ^+ {, d
. t: f7 M# L% `/ n* c
    for (i = 0; i < OUT; i++)  z7 H% _! |8 F: J8 m% V% {( J' u
    {
( u/ q  v- Y; {7 V- S7 p3 `        sum = 0;, G0 y% w7 u7 l' L
        for (j = 0; j < NEURON; j++)
- `! m: x4 W0 p& R, S/ X            sum += Wbc[j] * LbOut[j];* _  [3 G) G, X; t: S
         
2 h- H; S; |# v4 H$ c5 v$ p+ R9 A        LcOut = Fx(sum);
1 V; b' B- C) }% F3 t    }
  t- Q; X/ J. O2 @}$ I( b1 U5 R) b# s4 V
void backUp(int dataIndex)
$ r+ [8 X& y+ E9 u# w{8 F; D5 B  v+ A! ]3 _3 M/ e2 t
    int i, j;
4 G7 \$ S* @5 B$ Y! n0 ?2 \) y( z/ y    double sum = 0;
1 F4 M0 a, q& Z! E* V  }# J3 E    //Lc层单元的一般化误差# l: ^7 \! q3 i$ h4 ^9 |
    for (i = 0; i < OUT; i++), D) N( G" W) z9 P1 t+ U
        Dc = LcOut * (1 - LcOut)*(Lc[dataIndex] - LcOut);9 E% F; k# f4 k* O6 [  D
! f! k; V) P( N# ]
    //Lb层单元的一般化误差; o7 M; @5 t* g( A! F
    for (i = 0; i < NEURON; i++); ]& A2 K" }/ F4 d
    {" O8 I2 l: ^, a& x% ^0 O7 H& E# s
        sum = 0;, g7 O8 v2 P2 `% t
        for (j = 0; j < OUT; j++)
- x) I8 z# I& Q  o+ W        {
  n2 @0 @" v' h9 M) ]5 e            sum += Wbc[j] * Dc[j];
/ u: n) J2 D9 @        }& F% K) h7 M( L/ E
        Db = LbOut * (1 - LbOut) * sum;/ p& U" _4 m! i( D* [+ e7 _
    }
: D7 R, e1 j1 h. i3 Z/ @" d 8 R! u2 U3 \: ]4 Y# ~
    double beta1 = 0.08, beta2 = 0.1;  J7 L2 y3 G$ Q# i8 l

" Q! Q) _; Q9 g! W0 d1 k    for (i = 0; i < OUT; i++)
/ R3 Q% h. V4 |) V1 y        for (j = 0; j < NEURON; j++)7 j$ n! g( G6 _( c* G( t" ]" L# A8 ~
            Wbc[j] += beta1*LbOut[j] * Dc;
* i2 H% t% |! Z  I/ m; I% k7 U) Z# _ / e) B0 }: M. i9 y1 t( f2 z
    for (i = 0; i < NEURON; i++)1 v. O- g0 S- A
        for (j = 0; j < IN; j++)
, l* S, ]) `+ L" |$ V( P            Wab[j] += beta2*Db * La[dataIndex][j];
+ d6 i" n* U& C) F' }) E, e 0 `1 m7 |9 U) E& D+ o  J' z
     
- ?# D5 I9 J  W" Z1 a& u     6 S9 l" f. W* W; j# z$ z+ b
}& `6 ^8 {; `: v

! e& |; f# K* L. p3 K4 e& W1 Adouble result(double d1, double d2)
3 e# f# [& e6 I  m6 P- c{
5 S2 V2 a7 q5 U. z; D" e    int i, j;4 W* |5 L# U" T
    double sum;+ X4 B- S7 |3 n1 o, u4 u
    d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);;% s5 X: w: X1 r1 }6 g
    d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);$ m6 G8 r! ~5 i

" a, J! j' b; U3 W2 {) b* }    for (i = 0; i < NEURON; i++)4 K6 _7 S' E  _6 F/ x
    {
3 J# o2 O; D4 X" Q) m2 M5 K        sum = 0;         5 `# a0 v$ R* j* F; k
        sum = Wab[0] * d1 + Wab[1] * d2 ;
" a" M6 ?! [# Y! K9 B: ~, `5 ]) m        LbOut= Fx(sum);: E6 f. {* ~* y8 n+ v( V" z1 d
    }8 Y  n5 r% P, t# |% W8 H
  N: z& r  }% j
    sum = 0;
# Y7 H3 A3 [2 x8 o+ D    for (j = 0; j < NEURON; j++)
) z) Z! b7 K) ^. h        sum += Wbc[0][j] * LbOut[j];
! U& L$ g) o+ p. S! W! m     
0 C% a7 H; L/ A7 y    LcOut[0] = Fx(sum);
$ V5 B$ c2 Z. z, ~     
# ]3 Q! ^7 G4 _8 [3 G$ N    return LcOut[0] * (MaxOut[0] - MinOut[0] + 1) + MinOut[0] + 1;- [5 S# o2 Z- O$ m, X$ G+ m1 D

9 n9 J3 R6 [6 I7 C8 w: E8 d 4 s3 G2 j3 e) W1 b9 L) D" p
}9 y1 N! a( A3 M. }* _3 R
void train()
' Y5 y+ S/ j# l/ R{
8 Q( Z- r2 Q$ I) E. |& ?    int i, j, no = 0;
; b; H! K4 F$ P" E/ u    double e = 0;0 A4 L9 @# F  d* T' l
    do{# _6 T' X0 W8 r# I6 @' w+ @4 f
        e = 0;# ?4 T' k* D) y8 z8 Q
        for (i = 0; i < DATA; i++)
! c* ~. O* W+ z. v' n9 X        {
; u- X* j: }7 h- X% G            getActiveVal(i);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ! r  G  ]6 i0 @- K6 [
            backUp(i);
3 h5 s* Z( B. M% W; E            e += 0.5*pow((LcOut[0] - Lc[0]), 2);3 |0 ^) x7 G3 e! H1 l3 r0 {
        }* p* ?. N8 S* b* [; F
         ! w6 _1 g4 d- S5 m$ @
        cout << no << " " << e << endl;* M$ r) V5 e- K; `; O3 q. B
        no++;
3 ^+ x; d% r% \) w7 J    } while (no < 1000);
3 j( c8 `( O6 f/ } / K6 g6 {1 z) p& w
8 X0 }5 v* I6 Y4 v4 h6 o" u
}
" D6 [* {' c4 x % e$ v) B1 t; @9 K
void  main(int argc, char const *argv[])' f$ r" D* p, w' p+ r9 {) J
{8 e* U  f; Q& h4 l
     
/ ?) ?; E7 F1 W0 G5 c8 [    setSample();( B9 b, ^/ K! |8 c  ^4 e& }" n, x6 o
    initNet();
; I3 p8 j! T( s! Q% I" @    train();; w5 b# z( f. F+ M7 v2 V
    double a, b;7 {/ p: t. Q3 a: k6 X  @
    while (1)2 m' b* z: u# F0 m
    {
# V- ~% M2 R5 D+ O1 B        cout << "print two numbers" << endl;2 r/ V; q% `) C
        cin >> a >> b;( p; ]4 J$ G0 y' D9 l4 E! C
        cout << "result:" << result(a, b) << endl;
: s; Y3 k3 p- F7 m, V    }5 e# [  j! Q" m4 P! m  e  u
     
$ F) h0 ~) B, J     ' M0 w; i3 e9 B; b5 C
}[/code]
0 X! w8 ~1 ?7 c+ V5 _& D
5 s- f% m" W' V; b0 v) a# p% Q- y




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5