数学建模社区-数学中国

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

作者: syj52417    时间: 2015-4-24 18:21
标题: c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!% x+ e8 q# r6 h3 m  n
ps:不要吐槽语言。我知道这是c c++杂交体。[code=c]#include <stdio.h>/ `) o7 D7 m6 \0 e# g
#include <time.h>* o7 Z, G- b/ O7 z  a
#include <math.h>' \& G" W/ i" o8 ~+ u* r& ^
#include <stdlib.h>
9 ~4 q8 f" ]3 _% K4 ?#include <iostream>2 `2 ^3 c) O# a/ Q: _
using namespace std;
2 G6 y$ i1 s# y# ?: u#define DATA  800+ n& B9 R0 e4 l' J: w* s
#define IN 2
8 s% L" F% J1 o7 I  ?1 C. F#define OUT 1
* K4 `2 X' {; B- L& T#define NEURON 45
% p* z) C" I' |# S& {/ n% h& g3 e#define TRAINC 20000
7 R* l$ b# I$ w" A' \* C' i# |: V
% @- \  I9 m3 O7 S8 k$ Y1 O# Cdouble Fx(double x)% N% L6 |) v! B  O, G8 @
{# K" s7 m2 g- g1 B5 Q; B9 P
    return 1 / (1 + exp(-1 * x));
* W7 K/ M! m5 b' x6 z4 d}1 p8 U' R) ^7 d8 b
//La输入层  Lb隐藏层  Lc输出层1 q% G# u; j4 u- w6 Z$ A6 `. [
//样本输入) T( M! V5 M3 P0 R' Q# r3 j1 D6 n
double La[DATA][IN];( M+ {" c; u; F, Z$ o* N
//样本输出
- U: A! f/ q% z8 {double Lc[DATA][OUT];
3 d- w& K* K  U& k//La->Lb权重
0 E) l! J% c& F/ ^3 X* ydouble Wab[NEURON][IN];# c6 N+ r3 C7 ?3 T5 e1 A
//Lb->Lc权重+ u! k1 s1 T* i2 M
double Wbc[OUT][NEURON];
* ]1 `% I. O( G//样本输入每个向量的最小值,最大值;输出...
4 v$ i+ k  L7 A7 adouble MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT];0 m* H3 g% o/ H5 Q

2 |5 p0 b1 ?  Q: O; O//Lb层输出; X0 Y, e" l6 [. q
double LbOut[NEURON];
$ v3 H' m: P6 g4 M7 P' p//Lc层输出  d2 m: S* Q2 R7 Z" I- x8 n
double LcOut[OUT];! o+ C# a3 x6 `4 F$ X, J/ y

& M4 u1 v! G3 Y6 Z& Y, l//Lc层单元的一般化误差( l: w+ z" H1 ?7 W4 y+ d* C
double Dc[OUT];
! c, k1 x9 G' f0 x+ M9 h- f//Lb层单元的一般化误差8 \4 o9 D9 t3 i0 J
double Db[NEURON];+ W) V2 ~/ G  C0 S4 @- f  P

7 ?; D" o$ C$ |" m//设置样本数据1 i3 u2 U0 B  H1 H. C
void setSample()
/ j* V/ k4 T: o/ w+ n( s5 A{
) V; b6 U4 y; f! f7 p* s    srand((unsigned)time(NULL));
/ H  ~9 I; o7 y, a& l    int i, j;- W# E: @( m$ F) c9 M; C% _
    for (i = 0; i < DATA; i++); B7 A) L! @0 Z+ n- N) f+ [/ P
    {
, o) E6 [" `" @1 N- R8 D* q        for (j = 0; j < IN; j++)2 _0 @( O+ g* k/ ]1 B
        {
/ _$ E9 e4 m/ y" J7 |% \" O            La[j] = rand() % 1000 / 10.0;
0 @: k$ h/ X; D" j1 t' C        }
2 l3 D) |8 Y6 Z5 S : J4 d; a) I' p* g, D! |: i
        for (j = 0; j < OUT; j++)! p* o' z: u  ?4 d: p* o: g
            Lc[j] = La[0] + La[1];6 ?7 @& Q  l! B! \: A9 d/ c! u
    }
! m, e2 {+ l$ ~; I4 s' N}
+ b! _' J* g0 D4 f# M//初始化BP网络:权重,阈值(隐含节点+输出节点)2 [6 J) \$ T. T% @
void initNet()
2 C1 t% |# Q2 v. ]& l, h2 ~- x{+ d2 s3 i& p+ ]3 k- T; J& M
    srand((unsigned)time(NULL));
; U3 M( X5 U# n& M& H    //两部分的权值设置随机值【-1,1】
4 L- `8 T9 O% x6 h. j" q    int i, j;, y  |! ?9 B- e. F) K7 @+ ?
    for (i = 0; i < NEURON; i++)% f7 x9 u  ^& |3 o. E. v4 n
        for (j = 0; j < IN; j++)
% ]+ r' H( v" }$ h        {
& O% w" f8 }9 O% p            Wab[j] = rand()*2.0 / RAND_MAX - 1 ;
' h8 P3 H; y3 c9 h% D( L, c- l; D            Wab[j] /= 20;
* R4 x. A; R4 W" j        }
4 {  Q+ k) A: R0 @3 U, Y8 K9 D% i- y
/ K+ \' J3 m( i4 v/ c6 r; n! p    for (i = 0; i < OUT; i++)
* ?" n" I1 I! Q% L& R2 T. A% P8 M        for (j = 0; j < NEURON; j++)8 A" ]+ `+ h0 h8 v& m) X. N* F
        {2 l" K7 B0 M! \0 y6 J/ z
            Wbc[j] = rand()*2.0 / RAND_MAX - 1;
6 ~" d2 Z3 }$ E, H5 r: x            Wbc[j] /= 20;% g" @  Y1 B, r+ y+ K* L5 L
        }
) F2 p* _& H& H6 ?' Q     ' O! K) e6 O  [) y8 m7 T1 {! a/ ]
    //找出每个向量最小最大值,并进行归一化
8 p6 q1 X6 t# ?% \    for (i = 0; i < IN; i++)* W5 X8 N" i% p- H
    {9 }0 f8 b) T9 V' B. }8 {
         0 q! k3 u8 y1 r+ _
        MinIn = MaxIn = La[0];6 w- T5 [; X0 ^; F
        for (j = 0; j < DATA; j++)
- S% A  J1 {: [  O9 b% s, J        {( q1 d( i" [1 E" H1 b/ d8 x6 N1 w
            if (MinIn > La[j])$ I7 s' B  A& @" M. f2 F3 r: \; Z$ X
                MinIn = La[j];$ O9 I$ F* m  s8 j- Z! ~0 K
            if (MaxIn < La[j])% T! r' F$ ^( J  v8 |) V7 u$ p
                MaxIn = La[j];
( }' V: b/ Q- @/ Q" l        }  u% ?$ d& L- \' ?$ \% S
     
, d. M3 {' v- D; N         ) c4 |; _! Q9 R* G5 x
    }
4 K  ^1 @' T6 T& y3 q
3 U) ^9 v/ R+ b3 \- N' F    for (i = 0; i < OUT; i++)9 r" ~4 |/ X/ X
    {+ l$ A+ Z6 y* j& E" a5 X8 H3 L
         
# }6 ^  k4 s9 S        MinOut = MaxOut = Lc[0];4 E- C6 k7 w/ h" {! J- |6 J
        for (j = 0; j < DATA; j++)6 L  Q0 ?3 ^; ?
        {
  e* ]; W, K. Z! e            if (MinOut > Lc[j])$ V; o+ x; Y$ f9 E  m
                MinOut = Lc[j];3 J7 _  k4 v! ]) ?1 \# u
            if (MaxOut < Lc[j])
4 Q8 [8 o3 h0 Z: T" `+ l  ]( y                MaxOut = Lc[j];4 g# J% O; Z; e: I2 ^
        }3 \* |, Q  K+ e2 E& }- Q
! K8 h; q! W, O4 U- z* @! e
    }
$ {- @2 A  o) T ' b6 C* B/ J- H
    //归一化
) I5 Z8 M  C8 @- e( g* A8 ^    for (i = 0; i < IN; i++)
  n6 ~9 o6 \% R/ h( F6 @        for (j = 0; j < DATA; j++)% E5 j. q8 y* k" J1 D7 x$ e
            La[j] = (La[j] - MinIn + 1) / (MaxIn - MinIn + 1);
4 G+ }0 ~$ d1 I3 M* s" Q6 T            
4 N. @  M; U, b$ e2 W  t& Q! P
& o+ Q: R/ O' C; j1 l% N: B  C# ?    for (i = 0; i < OUT; i++): w  D8 i( A/ A# U+ c
        for (j = 0; j < DATA; j++)
8 d5 ]1 y- a7 O4 t9 j: ~            Lc[j] = (Lc[j] - MinOut + 1) / (MaxOut - MinOut + 1);
5 `$ `7 B: p% C1 n1 [7 d6 |         
- O9 Y: i- Q. r: f! k             * U5 {1 Q  ^8 V
0 u0 @4 }7 _2 Y! F2 v
}8 c+ d3 y3 M8 S" z7 X- K
void getActiveVal(int dataIndex)  ?. B! d$ a4 T5 @
{, n2 F% y) {/ h6 d3 X! z
    int i, j;- P2 T: t! o9 b0 ?
    double sum;
  [- Y, @. K7 H. W6 s    for (i = 0; i < NEURON; i++)
* @" E$ Q4 m7 t* x# H9 k9 C    {. a' m+ |2 g  L
        sum = 0;
" }7 i. ~: `+ i) k6 P- n        for (j = 0; j < IN; j++)
7 j  k1 ]2 g4 p$ z6 p            sum += Wab[j] * La[dataIndex][j];; {" H  M+ J! j1 E" ]
         ! \/ M+ k; n# H' m$ g- D! F- A' b
        LbOut = Fx(sum);1 Y2 f$ D4 T2 O  i6 ?6 T

5 W; }+ y9 c+ A9 o    }  I) h  ?& [& ?+ c

- E3 q% a3 ?% B& ^& H) p  p. p    for (i = 0; i < OUT; i++)
) J! V5 [+ Z# O5 {8 H5 Q    {  U" [4 w3 \' \( y3 D$ @
        sum = 0;
+ T# L: P* V1 }# m        for (j = 0; j < NEURON; j++)# F3 x3 D5 S0 M: U7 ]- d: k
            sum += Wbc[j] * LbOut[j];
7 f# d& K/ E3 p. A         , k7 Y  g8 Q% Y% R4 D0 {% ?5 {
        LcOut = Fx(sum);* T/ @/ R( J* @4 h, E$ T, l8 {; \% w
    }# k1 w3 c' h- j% u* F
}
8 P9 w" l8 U0 Jvoid backUp(int dataIndex)0 D& A8 W3 T5 c5 S0 e: k
{& q: r/ j- A3 O5 q+ Y5 W5 T
    int i, j;
% M  v) e1 \" q, }% o    double sum = 0;
! j9 h3 T6 `& m; z9 A  B% e# N    //Lc层单元的一般化误差* K9 j  ~% k7 J3 m
    for (i = 0; i < OUT; i++)
4 w3 ]+ \% Q3 L. W        Dc = LcOut * (1 - LcOut)*(Lc[dataIndex] - LcOut);
1 w6 S! e0 c* n8 J3 y+ W6 d; y. Q " S/ ^" X& B- h4 b7 q8 F
    //Lb层单元的一般化误差5 Y  \9 L- l: J1 T7 D6 L6 h' @
    for (i = 0; i < NEURON; i++)# H! A5 X; K' Z3 a
    {
7 b+ ?$ F) @  q# d! F, Y0 L5 H        sum = 0;
2 s) o9 ]' j9 Y        for (j = 0; j < OUT; j++)
/ |9 x9 c& G) h& L        {
0 W$ }. G+ O% k* f1 A, z! e7 [3 B            sum += Wbc[j] * Dc[j];4 D& F0 h. Q4 ?) ]# u" g
        }
: d5 r! M; y$ e6 V        Db = LbOut * (1 - LbOut) * sum;
8 d4 D6 R/ }7 G2 \1 D1 A) S    }
; U6 r; e  \2 q/ C- y' W ) y( ?- u5 b2 b, Y* Y
    double beta1 = 0.08, beta2 = 0.1;! ^. ~3 _7 @/ h% R

, K, Y  I9 S4 P! |! X    for (i = 0; i < OUT; i++)
7 I6 y; v) g% B( c        for (j = 0; j < NEURON; j++)1 K! e0 o0 e$ h( d7 e6 {
            Wbc[j] += beta1*LbOut[j] * Dc;+ G  \  g5 B' p2 Q; s* n
! H2 O5 z" p, x* T) |) u' Q, ~
    for (i = 0; i < NEURON; i++). z! m9 d, @. N2 {& H8 w6 r8 N
        for (j = 0; j < IN; j++)+ _4 b4 U8 W* \7 n, z
            Wab[j] += beta2*Db * La[dataIndex][j];
+ [. {6 t* h! u! H+ o3 S: b7 V
( B/ {% n; Y% M# d2 N1 u     
# I+ ?2 z( t4 ?- e  j     
  a- n& e/ a0 {}) ]  g( L1 M* d4 M- m
. x: x9 Y3 r& u  a1 ~
double result(double d1, double d2)3 B( ^( h0 u  m/ M8 @: b
{
: X+ f6 \! s& _' T" r, F    int i, j;
6 N4 E0 x6 c; j* }1 h  X* @8 B3 h    double sum;
! ^9 Y! s+ o# o& K  O    d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);;
6 Z  s2 o1 R$ y3 x2 T# z    d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);/ z2 n. S, h! ?8 k

% x9 h3 p& J4 k# a  n2 ]    for (i = 0; i < NEURON; i++)3 x7 |. _9 m$ t: y  W: ~5 i9 q, d
    {! e5 ~( o$ M+ h6 w
        sum = 0;         : @3 Y, U( [8 _* y7 _# M
        sum = Wab[0] * d1 + Wab[1] * d2 ;
) D" |, j$ u' x' u; o# g1 G        LbOut= Fx(sum);- N3 e3 A4 u% s
    }
) f9 U/ B# }+ x. }! R7 f
- _+ f3 d$ T2 q, k% L+ S# ~    sum = 0;/ h) p5 f: T/ T5 Z
    for (j = 0; j < NEURON; j++)
7 I, g# |" g; h        sum += Wbc[0][j] * LbOut[j];2 N% C. {4 B9 B+ ?* k, F7 N. K
     
% g) v+ i& t) N    LcOut[0] = Fx(sum);4 T6 j- j0 j+ ]$ M; b
     
. g' I# v- C# q    return LcOut[0] * (MaxOut[0] - MinOut[0] + 1) + MinOut[0] + 1;
+ B! [8 k- r8 `1 C+ j6 w
6 }$ L0 g- }' j" l  {
0 U* R1 ~* B; q3 J2 r. O& j}. [0 r# z. M& e  z  v8 N, s0 g6 m
void train()
! e+ j9 c) W( p, I+ _7 R% N/ v) D{
* ?; A/ j* Z9 r. x    int i, j, no = 0;
8 c" l4 `0 \/ _7 {- o    double e = 0;; ?3 X; O" `$ G
    do{+ O# |+ R1 K9 L, `4 m" ^/ D' R) d
        e = 0;
" {5 A! M! f) i! E0 X: p        for (i = 0; i < DATA; i++)$ P) e, }" N6 J8 N
        {5 g7 q# q: t( S( P
            getActiveVal(i);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                1 k# b, h+ a9 L' D! o' ^0 Y
            backUp(i);0 O) C6 F1 ]0 n0 M5 K8 x  V
            e += 0.5*pow((LcOut[0] - Lc[0]), 2);+ f# P' O6 ?) Y
        }
2 ~0 \3 E4 J: f4 ?         * h# O5 D7 {8 W) u
        cout << no << " " << e << endl;( |/ @: a  X0 V$ U8 g, o
        no++;
9 G- E* c: L: p    } while (no < 1000);
- C3 U' p2 G# [% N
& |" s, E% h6 N4 e4 z
% k' Z$ U$ s0 L}
6 ~% @* x# H/ _% e2 T5 H 3 I6 d. c0 _, Z& w2 p
void  main(int argc, char const *argv[])
! {; N, Y% ^( z" e{
4 B/ V1 I: u, m! |3 l( \. O" T% [2 E     6 J3 ^3 b' C: S. @
    setSample();
: ~* J" o" {0 d& `; S9 N0 x, M9 @    initNet();
8 j. v$ A$ H9 N4 ?7 N& e* A6 {2 Y    train();
# x5 ~  |8 E, x9 T" c/ N    double a, b;
* L0 Q. a/ t7 ^+ o. X6 _8 x; g+ S    while (1)
/ J9 a# q% z% g7 c; }+ X& i    {1 _9 J5 a+ x+ l- @; p
        cout << "print two numbers" << endl;% C- E  h/ L. J2 I0 h; k" \  W
        cin >> a >> b;# u/ V' n1 `  q% S% u) @$ F
        cout << "result:" << result(a, b) << endl;' Y" F9 F: ^+ U9 v3 {7 \/ o
    }
3 [- J3 J3 B2 H9 e' ~6 v. G  _! r     
: f) H& r! N+ f6 u/ R) H0 l     
0 o& R9 N/ [7 I. l+ z}[/code]5 i2 V" I" n3 w- V5 j; A! u. n
0 I1 Y6 m$ ?$ [2 i  q. y! _" T





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