数学建模社区-数学中国

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

作者: syj52417    时间: 2015-4-24 18:21
标题: c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!) B3 O, m$ H9 X/ m0 x
ps:不要吐槽语言。我知道这是c c++杂交体。[code=c]#include <stdio.h>6 Q: K3 I0 _/ o* D
#include <time.h>
5 l1 N) [+ F0 u+ \8 ]* F#include <math.h>
+ m" h/ `% P7 |5 H  _#include <stdlib.h>0 `& Q% e2 K2 _! U: b- `$ C! s* z
#include <iostream>4 d8 o/ h' ?. I0 H9 B5 c
using namespace std;% E8 g/ l% F( |1 t9 Q
#define DATA  800
# y8 z% {; W9 u! k0 H9 x#define IN 2. N  S2 D; g1 \$ Q8 x( G" o
#define OUT 1
% f/ x" J; R% M3 z#define NEURON 457 m9 D1 l0 V$ b. s* \
#define TRAINC 20000/ d/ o) d8 d. N- y2 `

6 |6 [. |- c  }6 Y+ [% H  L5 Kdouble Fx(double x)" u5 r; @: B# R; W. i5 ^/ e! D3 }
{+ ?% D, ^, \- U, E; G7 E7 H0 b
    return 1 / (1 + exp(-1 * x));. a, ^" Z, C0 P! O  ]# x2 ^
}0 H* M$ [3 j- Y4 ?* O# y+ s  k
//La输入层  Lb隐藏层  Lc输出层! B* g' j% r; D/ [
//样本输入3 \3 u5 `) P8 k& @, C, a
double La[DATA][IN];
0 x) m! u4 M4 \+ [& D//样本输出
' [, Z$ g+ J6 E- f! Ddouble Lc[DATA][OUT];
5 ]; K- N0 t: M# b' Z$ ~: T  z# R//La->Lb权重  s5 s) A, q; _! s$ j
double Wab[NEURON][IN];
6 m7 {6 _0 [( ~0 T//Lb->Lc权重$ ~9 r' S  v/ }8 Y
double Wbc[OUT][NEURON];8 s$ ?0 d# k( G4 `# g* U
//样本输入每个向量的最小值,最大值;输出...
* {! o2 P: e, ~+ C- J. ldouble MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT];" o- H" z3 W  O0 R
1 {, ]* [5 l" W
//Lb层输出3 z; Y0 F6 }3 Y: c9 b( x2 q
double LbOut[NEURON];2 J9 `4 M6 Q4 k
//Lc层输出
2 `0 Q5 w$ Y+ _" R. q( sdouble LcOut[OUT];
0 k0 M, _2 f2 G" I% b. S$ u, q
1 }! i* Z2 V" }//Lc层单元的一般化误差
  w! }! D* G% \5 t: }* vdouble Dc[OUT];/ t5 V; t) s/ H' }& K# B; x# C
//Lb层单元的一般化误差1 ^8 n8 w& \3 Q; w9 R3 F* S
double Db[NEURON];2 e, ^! q. x2 l! L. Q0 }

$ Y; N$ R* {9 R5 ~( G7 J//设置样本数据' ?- C# T+ G* I3 I1 B
void setSample()
# t4 i8 Y6 \% y- y9 u! v6 m$ R{+ U/ s2 @1 O/ w  Y5 d* Y# y
    srand((unsigned)time(NULL));
$ ^9 p5 @2 q+ V1 g# @# k2 H3 e    int i, j;+ |: z2 t- d4 ]/ U: b1 V5 O9 s& a- _
    for (i = 0; i < DATA; i++)
! c; ^7 l, Z* E$ g& l9 u/ J    {
7 \' ?- B* @5 Y) }  D6 l) T        for (j = 0; j < IN; j++)
4 y2 U. |) R' g; Q. M- A        {
, a! e$ t8 G" |* r8 Y& q0 ?& ]; l            La[j] = rand() % 1000 / 10.0;
; M) `2 l% ]% t2 Z1 D! x        }& q& L' B7 T# d9 a: F

. e6 S) G1 H6 e% G+ Z) m7 M        for (j = 0; j < OUT; j++)
" S$ Q7 M; y# B9 N* M9 W            Lc[j] = La[0] + La[1];7 `; J, _4 I! b4 O8 p& M- g# G
    }
0 V% i  C$ a; o! N}" `; }& |7 A4 g
//初始化BP网络:权重,阈值(隐含节点+输出节点)
: E+ q8 O- Z4 R/ t3 evoid initNet()6 G& J+ z, w" B# S, }1 R. G3 o' d
{+ ]6 d$ U) v! m
    srand((unsigned)time(NULL));  x; k* x0 J( e* n- X
    //两部分的权值设置随机值【-1,1】3 e) g* R  ^  d' S7 S; A, B, d
    int i, j;# p( p+ ~# ~9 M/ j
    for (i = 0; i < NEURON; i++)$ K2 b& n" k* `6 c, H0 M
        for (j = 0; j < IN; j++)
6 d9 K) q. g. g2 l2 L2 Y        {
& c( }# P/ p9 Z9 Y  x# }/ ~" o            Wab[j] = rand()*2.0 / RAND_MAX - 1 ;
; Q) t2 j8 x7 c' \% s- G            Wab[j] /= 20;
, V' ~  }  u1 ^  p, ^. u        }* Y3 e: F8 U1 `" L4 O4 [: s; a

6 \3 L7 O) ~7 r( A0 V% d2 E+ @    for (i = 0; i < OUT; i++)
1 d. s4 ~7 [& p; s1 y* d        for (j = 0; j < NEURON; j++)
& ^5 u1 N/ T' p  h7 c( t: F        {) f. p  b3 S# y/ q
            Wbc[j] = rand()*2.0 / RAND_MAX - 1;
8 y; f6 H) n0 H; d$ S( n" L' Q* C! q+ u            Wbc[j] /= 20;
! I6 X# H; ^. p" V# b6 e        }
8 p  o; ~2 i) k  A% Y1 l! J$ z     * b) r2 r1 I0 H0 d5 i4 G
    //找出每个向量最小最大值,并进行归一化. I7 n' r3 y1 {
    for (i = 0; i < IN; i++)1 E& w/ u: {* o: L2 o1 T& S
    {$ s* h' H* m' i
         
! t- R  e) \# i* H+ [; T        MinIn = MaxIn = La[0];- L4 @, t2 E4 q( j4 I4 p: p$ s
        for (j = 0; j < DATA; j++)3 p3 n, J" ?7 U$ A! t; U& T2 X: H0 q
        {
" m0 q- u0 N' K3 r$ _            if (MinIn > La[j])
+ X5 K& k  E( s# J* E. a                MinIn = La[j];
6 e. U3 m0 w6 F4 T5 A2 B/ ?' H            if (MaxIn < La[j]). v0 I  |/ S0 x) g6 p3 e
                MaxIn = La[j];, Y+ m8 Y" v5 v9 b5 {  A
        }, V& `9 v. X8 c, `
     
0 m% T$ S# \# L7 }, s: T         
5 M% O9 B9 M5 q' X    }
0 u! K, l2 T! l( r5 D) x % X1 i4 x* l0 n$ p8 k  A* u
    for (i = 0; i < OUT; i++)
/ I* I3 \" n8 `5 [" }: j+ a9 E    {+ [4 [% M$ @( Q- b3 B0 e2 ^
         
( W' o+ j8 Z( @5 N. \' U7 C        MinOut = MaxOut = Lc[0];; a. H3 y# D+ R  A% ?3 O
        for (j = 0; j < DATA; j++)
& G, Y# }: c* s, b        {
9 n" x5 ?1 a4 g  C: I' T            if (MinOut > Lc[j])7 h4 l8 _7 E( b5 |4 N
                MinOut = Lc[j];9 w/ G! l& C# J- [9 D9 M1 F
            if (MaxOut < Lc[j])( p" |* u% B4 |  a6 S: ?7 B
                MaxOut = Lc[j];
1 F0 @8 ]# p4 @" M        }
; V3 B4 A3 e# E* j/ s9 _ 6 L4 O, f$ ?- s+ V* Z5 Z) r
    }1 |2 s: |( ]- ?; W6 H6 R! H' u
9 _0 v+ O2 W) R2 ^8 _6 r: q
    //归一化
( ~- \4 ^+ f* Z5 {& s# _, T& Y    for (i = 0; i < IN; i++)' v- l/ a5 ~1 x! U; [* C
        for (j = 0; j < DATA; j++)
4 L3 g3 x# }" O5 N$ F% \            La[j] = (La[j] - MinIn + 1) / (MaxIn - MinIn + 1);3 k7 V! a0 F5 W, a5 ?2 ^9 ?
            
" R+ _, N0 L7 s8 b" b- |2 U , d% ?% S3 G4 s1 i2 Y: n( B: g
    for (i = 0; i < OUT; i++)  o( d- o8 ?9 B$ I
        for (j = 0; j < DATA; j++)
5 f* D" |  i5 N6 F5 Z- t# A9 s            Lc[j] = (Lc[j] - MinOut + 1) / (MaxOut - MinOut + 1);3 k: \6 A; \# A! X/ G
         ; T8 `! X. c) Q( U2 h& p8 ]
             1 l( f- }/ B+ F/ {1 P
5 m5 d0 k. Y1 s6 h
}' X2 M$ S5 ^! d& T( y6 |" K: S
void getActiveVal(int dataIndex)- I; x1 V6 O9 H( Y5 F
{
) M% B8 l8 V4 D1 V7 r    int i, j;9 [+ |$ p- y2 b9 K" d: @- A' ]5 }
    double sum;
7 n* E/ H  ]$ n  ~! ^    for (i = 0; i < NEURON; i++)
; H+ f# n6 @- Q    {
* L- z2 A& D. J. M8 W        sum = 0;& V$ X( R/ H% }& H$ x- m
        for (j = 0; j < IN; j++)" J% G) {& U7 D4 {- @
            sum += Wab[j] * La[dataIndex][j];
9 j* o: O# h1 m0 i- K- p2 U; W         & @6 H3 Q# R7 Z( s+ o- z8 `& N
        LbOut = Fx(sum);
0 d6 V: J2 U. {& u0 T- c " }0 h3 s8 V8 f' V
    }
' e; K; J1 J$ S) B! Z3 K ' o4 g5 F! L$ H
    for (i = 0; i < OUT; i++)1 b, R& J' R8 J  y9 G
    {
9 ^( i4 ~. a' p8 |4 S0 }0 [0 {6 q        sum = 0;, B$ v& x' @3 _. [) t2 v6 f( M7 k
        for (j = 0; j < NEURON; j++)7 X  A$ f3 I/ |" Q) y8 G4 C/ x
            sum += Wbc[j] * LbOut[j];
4 f5 K. U* n$ s: X/ U" [: i0 F         , |2 r! K8 K1 u4 [- M" }4 I
        LcOut = Fx(sum);! W4 U; J& [! b. D( k- f" G* v% u
    }" H  i# A# b1 a( R& G0 k
}
" g2 o; Q1 p+ D8 Yvoid backUp(int dataIndex)1 W1 Y; s4 Y. ]
{3 T0 ?* k+ v# J- i$ K/ L+ X
    int i, j;' C8 X& d8 ?. ^6 \% v8 m0 s, R" K
    double sum = 0;
. h: r/ \6 M% F( n) j- F! V    //Lc层单元的一般化误差
4 f! C% {, l# M' y. b% E    for (i = 0; i < OUT; i++)) `. A1 V3 B8 S( s2 Y
        Dc = LcOut * (1 - LcOut)*(Lc[dataIndex] - LcOut);/ |' w# o: n& f& }" Z; {  N# E, {' f
7 q/ X- B8 a  j9 ?7 ?2 n
    //Lb层单元的一般化误差4 c" t+ X3 ]8 d. C( v4 q
    for (i = 0; i < NEURON; i++)
: a( H. h( y7 y4 ?% k* j  r2 c  Y    {
! l* G: g: N# g  q; r; |: K        sum = 0;" l6 o) B6 M  m
        for (j = 0; j < OUT; j++); t9 p+ v% z$ k/ z$ H
        {
5 q) z# I) [# a% b4 l+ G% B" K            sum += Wbc[j] * Dc[j];
# ?9 B# c# m3 b7 K4 H$ o2 B        }! l8 V! c& J0 s
        Db = LbOut * (1 - LbOut) * sum;& g+ B* D# z0 G- R9 u. F/ q
    }
- D9 n' _( L2 E   d/ }0 A$ o- r3 }7 J0 C7 ~
    double beta1 = 0.08, beta2 = 0.1;9 z  R- I4 j( n+ f
; @" c) J# h# \- V
    for (i = 0; i < OUT; i++)
+ d8 s5 U3 ^- r& ]        for (j = 0; j < NEURON; j++)5 `, C# [3 \$ l) f8 O3 n) D
            Wbc[j] += beta1*LbOut[j] * Dc;
3 R" c' i* B2 i& O+ ?  n / q: g; {/ T! ^8 U9 W% o+ }9 s( e+ m
    for (i = 0; i < NEURON; i++)4 d3 M' G: a# O5 r/ x8 e! ^
        for (j = 0; j < IN; j++)) Q1 e2 l4 X1 E7 C; o0 ?0 P% W, ]: ~
            Wab[j] += beta2*Db * La[dataIndex][j];* ^$ J7 b! s5 G% c) [

) T# R) E! F+ c     ! n2 R: q0 u  L7 j
     
4 V& o6 C! q2 I9 X3 Q  {}1 Z  p) G% p$ j
  K9 o7 Y. G. s1 `/ j3 X
double result(double d1, double d2)7 J( n4 f% r3 ?) M
{- g. @+ u' U) ^. }: S' f. B" D% E
    int i, j;
; w. s+ Q# ]$ U+ P    double sum;
: J6 p6 m' }$ |# ~5 ^0 A! H7 i    d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);;
- P0 q1 R. m$ ~3 V) X; ~+ u    d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);
- U2 ~' s7 f# B) ~* @# D
7 T& f- d9 M! F( o    for (i = 0; i < NEURON; i++), v  o2 G2 m8 \* a+ z3 B- ^
    {
  p3 c& O# H  z        sum = 0;         & Z7 t  E. ]9 w, A9 j" U/ ]% B# ], k
        sum = Wab[0] * d1 + Wab[1] * d2 ;
& Q) u0 i2 J/ G9 q2 |+ z4 p6 C4 N- m        LbOut= Fx(sum);
' Q) t& S% \, ~% @% |9 Y8 ^0 G    }
- C+ z2 X- P, ^& L3 [2 o$ v! S
1 `! D& v; ^$ _' ?6 Q& n, s    sum = 0;
+ r5 @2 L5 V1 x7 u- M' d    for (j = 0; j < NEURON; j++)
: I3 T; [/ J, ~" Q        sum += Wbc[0][j] * LbOut[j];+ |/ M6 l0 Y3 k# s
     . A/ Z7 Q+ j' \
    LcOut[0] = Fx(sum);
0 M5 ^/ a5 Z% t  n+ Z     
. {; [' |7 g* d! {9 R    return LcOut[0] * (MaxOut[0] - MinOut[0] + 1) + MinOut[0] + 1;
3 A( ~" S9 \' Y6 Q ! h) M& E$ n& a; c7 `6 K

' `! e7 |4 Z- A}
7 d. K/ ~  ?: K* ?7 n" Pvoid train()" w$ Y" U5 f0 j: m3 J
{% ]- |. l. e# s! i# p+ E
    int i, j, no = 0;- ^+ p3 x. C8 ?: P+ H
    double e = 0;
! V9 Q" M: o4 i* J    do{8 z  T6 R4 i2 H; O' p
        e = 0;6 y) }. W2 ]8 f6 }/ c/ A
        for (i = 0; i < DATA; i++)
# ^9 s7 |/ I7 P& F0 B        {" U- k1 n+ y  k/ P# j
            getActiveVal(i);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                . o4 H. l5 z$ s# b/ R. M
            backUp(i);
  x7 u: v* v6 l1 u            e += 0.5*pow((LcOut[0] - Lc[0]), 2);
# N3 O+ k- i9 S7 W; U        }
  w! j( J8 |' |7 F: s: r+ s         0 X8 l: \1 V% ]- q/ Q. _, |
        cout << no << " " << e << endl;/ r# R/ c& Y1 u, A$ m- X6 D
        no++;
1 [9 Z5 \2 W' h6 R    } while (no < 1000);
& v! N6 w# ?; j% G+ E0 ^ ) J9 h" s# C" q4 X

: g! |- l# {8 F# A/ T2 M6 A}+ w. A0 r9 h8 D

; t( N' ]+ w! @; j0 L7 dvoid  main(int argc, char const *argv[])
: T/ O( B0 v. j# Q. }+ m6 b{* e& I" o- x4 N8 B
     
/ D8 P; m( R$ b5 {: C/ ?7 }0 \    setSample();7 U; ~: k6 q* n7 W  ?) F
    initNet();6 ?0 U  g1 I6 q  \3 {! l) R
    train();
% C4 |7 M, L2 l' a" Z. C9 q! g: O    double a, b;( j. p- `1 y9 d7 n+ X
    while (1); {: u2 ~: w+ L: z
    {
& R& c' }. m5 @1 h( j        cout << "print two numbers" << endl;: `# J$ @4 s9 y
        cin >> a >> b;
  c! t2 ]7 S  G! A4 C8 z        cout << "result:" << result(a, b) << endl;( S7 x! n0 \& [1 m
    }
, k0 G8 \/ L& Y+ K; u. h. ^     : ^6 b: S$ J9 C4 B* R
     
1 M0 {3 B; ~% F+ d}[/code]
- N7 Y/ }$ X5 E' b, M; i6 j' d





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