数学建模社区-数学中国

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

作者: syj52417    时间: 2015-4-24 18:21
标题: c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!
" \0 z1 E" a, wps:不要吐槽语言。我知道这是c c++杂交体。[code=c]#include <stdio.h>' Q% J& I. K3 N/ f, A8 C6 {+ n* z6 J
#include <time.h>$ [% r8 i  w$ f% _8 L% a& }4 l
#include <math.h>+ Z9 x3 h8 k1 F  {) y
#include <stdlib.h>
+ n  i6 r1 i, v  R#include <iostream>
/ U5 s, a) [  q2 [) N; dusing namespace std;- Z, Y5 N& J+ S
#define DATA  800% F: p, z1 T) o% e; z
#define IN 27 D3 W& N2 i% E  R2 v
#define OUT 1. D5 c6 c& X  @* J
#define NEURON 451 x1 ^4 X5 k) }
#define TRAINC 20000
" A( b- k# j: a4 F! K
: ?: q* D) h( Q9 F7 Udouble Fx(double x)- {& _) `* N# O; k6 K0 M
{: A/ x/ v, M# u4 |
    return 1 / (1 + exp(-1 * x));5 p) |  e7 ]- X, @) {. `
}
+ B9 I+ y. D( W$ t, p, X- z4 D//La输入层  Lb隐藏层  Lc输出层# v  O" B  E, ^# c* n
//样本输入% f/ V! B6 Q+ H
double La[DATA][IN];9 v  b6 j8 E) R- A
//样本输出
5 p2 k/ y8 m& k0 d/ Ddouble Lc[DATA][OUT];
/ @7 X2 r6 D$ ]4 O' J//La->Lb权重
& s2 F/ V* U3 h8 L+ M2 n0 vdouble Wab[NEURON][IN];, o% @  W3 J( C) W
//Lb->Lc权重
: W/ C0 Q0 y3 Q1 F5 A* {double Wbc[OUT][NEURON];
3 K% n" Z5 m, ^//样本输入每个向量的最小值,最大值;输出...
; G- n# N4 Q, ]) |double MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT];
- q' t; E9 o/ s  y; p2 ^
8 u( g5 x$ U( S& U) J- z) A//Lb层输出4 E& _2 a& G; }& B5 `
double LbOut[NEURON];& P  E, k) C# e- x1 s  w0 |
//Lc层输出6 a. D2 O+ G7 ~8 [. L
double LcOut[OUT];
9 K' A) L3 t8 Y
! `- r" x8 h) }$ b" S& h* o//Lc层单元的一般化误差1 @7 [4 t4 T; k* Y  a/ X
double Dc[OUT];
& `9 e* j+ {% y4 ~6 J8 a( I) B//Lb层单元的一般化误差" U3 `9 q: `9 c5 a+ _
double Db[NEURON];
' b$ |; T% Z, u5 c. d$ ?/ y ; ~* a6 C$ _/ l8 o% L1 N
//设置样本数据! l* k) ]% t  e0 G& g. S
void setSample()
8 s: {0 V: J6 f- Y  s{
' J  F  C0 k8 K; M    srand((unsigned)time(NULL));# @$ ~; Q" h4 V+ H; z
    int i, j;
( X8 j/ g5 f# U    for (i = 0; i < DATA; i++)( a3 X- b# {! }
    {
- D! x  W+ S4 @; }8 ?        for (j = 0; j < IN; j++)
; H) r5 ~7 t) E        {9 |# u. S* c$ R& _& y
            La[j] = rand() % 1000 / 10.0;3 i0 p/ n7 ]& I; Z2 t! }; d
        }$ i$ _. x% G% J% j6 Y

0 E* c6 @, b! c, [! |4 k* f: l7 [        for (j = 0; j < OUT; j++)
: V+ U9 A( V- p  s8 F( _            Lc[j] = La[0] + La[1];
$ |* g  O4 j9 P+ `% A8 u    }
) s4 c9 |; y8 w. `}+ B! }% n2 B2 g$ t! g
//初始化BP网络:权重,阈值(隐含节点+输出节点). t: c- r: J( D# }+ W- t9 ?
void initNet()3 u' S' |* ]: Q9 c1 }4 Y- ?
{1 G5 B3 J4 i( N% y9 x
    srand((unsigned)time(NULL));9 {5 V5 r( I. T  [1 T
    //两部分的权值设置随机值【-1,1】
  @  S+ i, U( z5 e. L* x9 B    int i, j;
8 i* X( A; X, E& x4 k$ p4 f) y    for (i = 0; i < NEURON; i++)
6 {$ }1 F6 j; O5 }1 m4 U) @3 w        for (j = 0; j < IN; j++)
; _4 \7 O" H: H  l" }        {( o1 T2 Y, c$ E$ g( m( k) Z8 R
            Wab[j] = rand()*2.0 / RAND_MAX - 1 ;: x- l5 @& t/ E& p5 U
            Wab[j] /= 20;; f! I3 Z, L; N4 K: X& b
        }
8 ?- }6 S# W1 I+ F& G  {$ i0 k
7 W( A, v  l% Z% x    for (i = 0; i < OUT; i++)
4 Y0 L7 Y* \. J) T0 X+ h* m3 H        for (j = 0; j < NEURON; j++)% ~* y) \% |: v; E, j
        {
. C& t2 M3 `- u- k% h5 N            Wbc[j] = rand()*2.0 / RAND_MAX - 1;) D' c! N0 D$ M( J9 ^. @! k6 Z- V
            Wbc[j] /= 20;( V1 y4 o( f! x
        }
, O6 v  r9 G" Z( I6 q1 v/ q     6 X9 F% \! h8 `" }: ?
    //找出每个向量最小最大值,并进行归一化
* P1 L* D* k/ e2 k- x' t9 M    for (i = 0; i < IN; i++), B3 C3 V# @5 E0 W1 ]0 `
    {  a2 I" o( X) l9 O
         5 x6 s. D0 _9 K
        MinIn = MaxIn = La[0];0 @8 n* [7 W* m# G% k0 R- M" v
        for (j = 0; j < DATA; j++)
9 h# U) |& T! ~9 ^' f+ F8 {, o  h        {" i# {6 D+ i( c1 q
            if (MinIn > La[j]): h$ C4 y& z$ f
                MinIn = La[j];! |5 D9 V0 c9 I9 o$ O
            if (MaxIn < La[j])2 m. d: u4 t: O* v
                MaxIn = La[j];  j: i; \3 t9 {/ p% h* n
        }; M$ M& G+ _9 F; Z* w+ a
     
- ?  x2 x4 H, n( X; s* [1 L         
1 D, l8 ]( [8 `: [  F9 a    }
: P" l) V/ D7 o- [; |* F1 r . o- |2 |! V! o1 q; i9 T. H8 R
    for (i = 0; i < OUT; i++)1 ?1 K! w) }1 ]8 D; L
    {
2 i  J$ {& p+ n4 p0 f. M         8 F* j( K& y8 S$ D: v2 Y% w
        MinOut = MaxOut = Lc[0];5 y; D1 X; T2 B" j- n" N
        for (j = 0; j < DATA; j++)
# D0 q' R% F' a9 ]        {
2 b* b: c  \# ]/ r' p+ Q4 A( _; p            if (MinOut > Lc[j])4 h8 g" g" F9 k) E& `& ]- O
                MinOut = Lc[j];! V& L" f) U/ D6 b
            if (MaxOut < Lc[j])5 ?* J6 {; f  o
                MaxOut = Lc[j];
7 v. Y2 Q' O3 j# P8 E& \- p6 j/ I        }- Y( U4 j3 h0 a4 j* U+ Z1 O+ r

# W9 o7 S! S* }2 r( |, x% C    }
( |5 q( x3 |3 ~/ M. L; F7 S , h. q: c0 ^$ E+ l  }& h
    //归一化5 g: V7 ~- G9 R1 r% M! U8 r
    for (i = 0; i < IN; i++)
9 I) p6 {  n( Z7 b! V        for (j = 0; j < DATA; j++)
3 J6 G% H2 B$ k) {4 D2 {            La[j] = (La[j] - MinIn + 1) / (MaxIn - MinIn + 1);+ L- g: j% m& i/ g! _  v
             " e) }, g3 r! {, y( q
  B7 F$ w. Z" v
    for (i = 0; i < OUT; i++)1 y' t; T$ _2 Q) e8 v1 k
        for (j = 0; j < DATA; j++), h% i, r. F. C, D7 z% @
            Lc[j] = (Lc[j] - MinOut + 1) / (MaxOut - MinOut + 1);: C7 t. M  K+ Z( L; s; W+ [
           c7 W4 O5 j7 A# N9 J4 B
             " u2 h4 d* {2 U* v( U( r- p
) h" H2 Q/ O0 F- h- N- R! R
}8 }% z, b8 d% D: E) l
void getActiveVal(int dataIndex)* v9 q) v, F- i. o  K/ e
{
/ H4 \$ Q! C+ U/ r' ?, _    int i, j;0 c; W0 [/ b% z/ u8 a8 y' C* j% v
    double sum;
1 Y' h4 |5 v/ s2 ^/ E* k    for (i = 0; i < NEURON; i++)
& T# k8 h5 X4 c# t+ x    {0 k, ?8 |% S+ T5 s5 h5 v) n) W
        sum = 0;9 I( U+ g* E& ^& d
        for (j = 0; j < IN; j++)
3 |) w9 M3 ]5 C/ n( h            sum += Wab[j] * La[dataIndex][j];5 w6 T' i) l  {3 B) g* m* H2 D6 W
         8 Z8 [- Z9 {8 c
        LbOut = Fx(sum);
. P- N! R  m, R8 C  ~6 g5 x
5 O1 S8 f+ A. \/ f6 y    }) ?7 l! \7 U; |0 L- t6 e
' _# l; e/ q3 {- E. v
    for (i = 0; i < OUT; i++)8 |2 j4 L! l9 d& W- K
    {
# G; b# u; @- @/ u1 s7 [, c        sum = 0;
9 [/ \* N1 c  C  Y1 X1 e5 S        for (j = 0; j < NEURON; j++)  b9 i$ p' ?& k( q  ^- U
            sum += Wbc[j] * LbOut[j];
& n5 o* D) ^9 [" f' E- @         
$ ?) ^; z$ ~( t7 N% z. g        LcOut = Fx(sum);4 F; g3 b3 E6 ^& P5 p. x2 W
    }4 O9 G" K( s$ [4 Y/ O2 Z3 e
}
% B' P3 {: C$ l# [7 P0 Pvoid backUp(int dataIndex)( m/ P# w" s9 Z8 {3 }
{
/ U4 m! a3 S6 z7 H2 g+ c    int i, j;* E, b5 n# T# Z9 G
    double sum = 0;
' G5 _0 o; ?8 c    //Lc层单元的一般化误差
- G3 \3 R4 [& S; X    for (i = 0; i < OUT; i++)9 X8 |- a* w3 Y3 _3 y. j0 J
        Dc = LcOut * (1 - LcOut)*(Lc[dataIndex] - LcOut);
; d( ?/ }: ?7 i
$ I/ e$ g6 V2 M/ J: v' u. P2 \2 W    //Lb层单元的一般化误差. n; n! R8 K& ^9 y- C) ?( x
    for (i = 0; i < NEURON; i++)4 W( c* M+ ]/ n, B8 U
    {( j* ^1 S$ \: {9 J/ g  _* y' a
        sum = 0;
! j5 d2 ~3 k" q7 @9 }2 T6 O7 O        for (j = 0; j < OUT; j++)
9 @4 w3 |2 z+ G3 F; i        {* r! g1 s. }$ d" U/ k7 |
            sum += Wbc[j] * Dc[j];
) V4 K$ M; A0 a; K        }9 q; O8 v7 f2 s6 U$ i$ a
        Db = LbOut * (1 - LbOut) * sum;
" q4 Z8 E* a- d  f% g) R. I    }& H  M8 o; q0 z: f5 A: f4 r) L7 }
) ^* o# J4 j- U! ^( l1 G, @
    double beta1 = 0.08, beta2 = 0.1;
- V- x. x3 l; K! W2 x , N1 W6 e3 j  ~, x6 m
    for (i = 0; i < OUT; i++)
. n  H0 c! ?9 o2 c. s; ~, Y+ T& c        for (j = 0; j < NEURON; j++)
* F' _5 m+ K7 D1 o. T6 h, e: J8 \9 H* `            Wbc[j] += beta1*LbOut[j] * Dc;  s% z! d9 T, j
. Q$ B) t) J) C, m  r1 S
    for (i = 0; i < NEURON; i++)
1 u5 \" |& J; T! e        for (j = 0; j < IN; j++), m- k; h2 R# `( ?
            Wab[j] += beta2*Db * La[dataIndex][j];. \3 ^. V4 o: i9 ~! Q
4 J$ B$ w2 K1 L: `
     * s$ J! M8 L* X* T" r: h# f  `% j/ v
     
4 H, a: p! b7 I  {; a$ T( Z: I}2 W" p4 T1 i* h( Q7 S! `; l
: i  s5 E: C* z  I/ G& E; c5 k; `% q
double result(double d1, double d2)
* R1 y( H  Y  t6 k# L{& }' `6 C" A/ |9 G  U9 f) i. W# g
    int i, j;
  L8 h( f" a( V! \    double sum;2 v! P8 I: m1 [$ _
    d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);;
9 b6 n/ p9 K% z! E6 ]    d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);
4 j8 q& c1 z  d: c
5 D8 ^7 i: p8 t2 M    for (i = 0; i < NEURON; i++)
$ X" R$ X* c6 q3 o: H5 w# {' N3 M    {
" J" I' d; F6 @  z: a' _        sum = 0;         
- `. m4 Q7 n+ p2 L" k        sum = Wab[0] * d1 + Wab[1] * d2 ;5 ~8 o+ D, X4 v1 P3 k
        LbOut= Fx(sum);0 g7 a" ?' A7 M9 ~+ Q
    }! W5 P7 o+ w6 u
& ?3 f& P# [# `5 ]2 w; [% z- i' |% }
    sum = 0;
4 X6 V& v5 m0 r4 X2 Z: n, P    for (j = 0; j < NEURON; j++)' O- \0 W' y5 b- D. X
        sum += Wbc[0][j] * LbOut[j];, g8 m; f8 H( S  V5 @: M
     / N6 |6 I+ _9 o, s6 u/ {
    LcOut[0] = Fx(sum);2 o2 w$ }: i) `  x
     
' T5 e, K  Y# I    return LcOut[0] * (MaxOut[0] - MinOut[0] + 1) + MinOut[0] + 1;
* M: K8 U) D0 ^5 s. I
% a3 j" W2 `2 ?: }0 j8 {
. {0 G# S/ G+ o" }/ @}
+ y3 }. w: n+ |, xvoid train()
/ @3 R! |& n) ?6 ^  G6 }) ^{
! |5 D3 R& ?% A; _; f5 z    int i, j, no = 0;
! S4 W8 i% L# o4 X# X    double e = 0;9 T1 Z7 L: r  a) C) m& h
    do{
" J# h$ h  r/ w3 `% l4 `& |        e = 0;
9 Q/ S* e- A& g( W        for (i = 0; i < DATA; i++)
5 d  n. z- \. q" I9 o3 m" x4 B        {
9 h& s$ i$ ]4 ]            getActiveVal(i);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
5 Y. X. {/ C' B: W8 D% v/ e            backUp(i);& Y: j& j% s+ x* G- m2 ?
            e += 0.5*pow((LcOut[0] - Lc[0]), 2);
  V  i5 \$ C7 r, p1 G        }/ K! E3 Z0 v  b
         1 s  Y4 g6 f, k# D8 D
        cout << no << " " << e << endl;2 O/ {) }0 @" j8 _; m+ Z8 ?
        no++;
' C" ?' b, O, b- L* [    } while (no < 1000);/ \, n# s3 y/ ^1 j5 m
1 Z3 m4 x- P) }  D4 m
: K6 g9 q: x" I$ @- _9 M; {. T5 m
}* w. t7 `4 ~3 ]  W5 A- `! D! S$ G

# j5 x. E: ?% q' ovoid  main(int argc, char const *argv[])5 a$ z' v- M, M
{
" g# U. z" R+ p7 |! O) K     
6 S( {$ Q& A( L! o. e    setSample();
% s3 O5 F2 h: V' F; f. p    initNet();
# Y$ N8 ^; ]2 e$ Y. j* I    train();
1 j8 F7 Z: q( ?; W    double a, b;1 J* F! L8 u9 g) J2 q
    while (1)( H+ P' o: p' j: L7 F
    {) F) Q% A3 U" D( M+ D9 Y7 D
        cout << "print two numbers" << endl;
& }3 h# i6 m" ]0 P; l: D        cin >> a >> b;8 o$ `. W1 M8 |( f
        cout << "result:" << result(a, b) << endl;
# z1 t; l8 i, d0 M# V    }# W/ [4 G' B0 \+ d  @
     3 W- E; A/ J# m3 j; P
     & i  O- u0 g& G4 @. B. y, |
}[/code]* K- e- ~% V0 H: i# g! U& C

6 @7 e4 z" n1 p6 b2 h- C$ _




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