数学建模社区-数学中国

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

作者: syj52417    时间: 2015-4-24 18:21
标题: c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!0 S$ W# Q$ U/ s! R# p
ps:不要吐槽语言。我知道这是c c++杂交体。[code=c]#include <stdio.h>, w5 T+ {- c) F. \; k/ H  [
#include <time.h>. T2 g" Y& D, Z. d7 I( ^
#include <math.h>
# C$ m( E: s9 D7 V; ]#include <stdlib.h>) L! ]. N4 i: W
#include <iostream>9 P/ U- N# }6 @8 J- J1 S
using namespace std;
) b) c! ]9 S* k7 q7 ]$ T/ y9 P$ P#define DATA  800, w) |3 i# `& k0 p* O/ ]6 m
#define IN 2) F+ U% S, N# e9 v: T2 n4 ^! I4 B
#define OUT 1
& t9 I5 b5 A8 H#define NEURON 45
. `( D( m9 t4 E6 ~2 F#define TRAINC 20000
; Y$ J8 W* }& Z* t3 i " V; k/ S% Y& d. z6 ^! u# ~
double Fx(double x)
$ B3 E8 H9 {; a1 }' b{) U" T2 l. |6 j- ]6 j2 Z! H
    return 1 / (1 + exp(-1 * x));. }# A) G$ o& X8 t8 y+ E& _
}
* n- X  u) a5 A) T: L0 _//La输入层  Lb隐藏层  Lc输出层
. R# `( N$ q& D) t//样本输入
% V" B( A2 h3 \7 y" Adouble La[DATA][IN];* i" v# K& D. U. F/ y* ~% o0 C
//样本输出+ v5 x- K3 g2 v
double Lc[DATA][OUT];
/ t- S4 c& s2 S: B//La->Lb权重
+ i, J( C$ _5 |4 p1 cdouble Wab[NEURON][IN];
+ h; C( J: B% v//Lb->Lc权重' u% q1 V( Q5 ]! o7 s
double Wbc[OUT][NEURON];
( I: h3 \: d: Y' y* t, k' Y: Q//样本输入每个向量的最小值,最大值;输出...3 ^7 e$ {9 [: ?
double MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT];
+ \/ o& w- ?4 Y* x; i$ l , f3 o/ |! D* q9 ~* r4 }# S
//Lb层输出+ x+ U0 W; ^8 f" S; ^" N; i
double LbOut[NEURON];
3 P. D% X4 |, m//Lc层输出
' [# N* O- c6 i0 W6 z2 L4 y4 M2 \double LcOut[OUT];4 Q  f& k! u3 a

- m  _; U: ~- s# h% G4 @' X1 V//Lc层单元的一般化误差
8 ^# q3 Z+ _' o6 pdouble Dc[OUT];! d4 u# }4 B: ^, k; B- h$ F
//Lb层单元的一般化误差# C/ X; `* F  {/ C1 p, k
double Db[NEURON];" h" C4 f& {1 A7 C

3 s0 }7 R/ n. _$ Q2 Y//设置样本数据8 h  Z, p& p9 v3 o+ \! z
void setSample()" r) m3 n! u$ n, `' q$ T# p& O
{
/ ?+ w( W+ U! z6 @9 w    srand((unsigned)time(NULL));: k9 _* q/ X( \2 x" [
    int i, j;& r% L% |& Y; M9 B& ^; A* M
    for (i = 0; i < DATA; i++); E% i" O1 I- a" K
    {
3 o# ^6 Z* k! F/ Z6 g7 E        for (j = 0; j < IN; j++)  H' h* ?1 n. m6 x% y! l
        {/ D6 V+ B/ s" n( L7 @/ o( I0 x
            La[j] = rand() % 1000 / 10.0;
2 R; y8 K* X1 \9 O7 q  h        }
& [! ~9 Y! d/ Z2 Q   u4 o* n! X% C9 |& ^- b, @. y
        for (j = 0; j < OUT; j++)
. r/ o! R) Q. R* y- H' N5 |            Lc[j] = La[0] + La[1];
# l$ }1 I) r5 A# B    }0 ^( m, Q4 q! D/ L) R% W8 E4 b7 b) c
}
2 S' T5 A$ i; h( `6 e( P2 k, A, `//初始化BP网络:权重,阈值(隐含节点+输出节点)
: g2 j2 t5 T) c* ^7 z  o) ]void initNet()
+ ?& c& X- f1 L* m{4 Z: P, p( \: {
    srand((unsigned)time(NULL));
; |% H5 q  N5 i  [; u# S    //两部分的权值设置随机值【-1,1】
4 N- g, j, k2 N    int i, j;: K$ i4 y$ [. ]* ]( T. [- W$ u
    for (i = 0; i < NEURON; i++)1 ~4 f2 O8 _$ u" {1 ?
        for (j = 0; j < IN; j++)% D; L6 s) Z# _) r8 ?- e
        {
& F# Q# A8 r( C" r2 q& O+ z            Wab[j] = rand()*2.0 / RAND_MAX - 1 ;5 n9 i4 v$ L+ X% r# i3 k. K
            Wab[j] /= 20;! f- R4 N# j; g8 `  T: R$ Y
        }
; l! i- l5 o* q2 s7 l
6 k" W1 `3 E  R& V+ f0 D    for (i = 0; i < OUT; i++)3 v& e4 g7 Q; p! {0 [  s
        for (j = 0; j < NEURON; j++)- ^. g* {$ `8 d2 X- u9 M1 r2 k
        {8 b+ i: r, u9 y- Q8 N2 Z
            Wbc[j] = rand()*2.0 / RAND_MAX - 1;
5 f; G, w$ z. @            Wbc[j] /= 20;1 H9 u% M$ c9 v: z, S
        }
/ l- K6 }& n6 F- @     
" v% v# ^4 {0 `: K; ~5 M    //找出每个向量最小最大值,并进行归一化
7 {" J6 K# P  b' I    for (i = 0; i < IN; i++); d) |$ b7 H% Z- _
    {
' C: r- K0 S5 H& _0 h2 w         ( s* D9 i+ n3 w; v! r
        MinIn = MaxIn = La[0];. O; _/ m2 O* D9 h/ s
        for (j = 0; j < DATA; j++)4 i/ ~+ n# K+ y0 \# e& Q& _. ^
        {% e+ j" z, D/ B8 e7 i# Y5 [, W. M1 z
            if (MinIn > La[j])
6 v# U( ^0 d# Q2 h/ o4 T                MinIn = La[j];
3 Y) Q- i# J. E            if (MaxIn < La[j])
; F1 |% L5 @" K; t9 z                MaxIn = La[j];: K/ b) @0 d) B3 L7 H! i" {2 R' N
        }" p# {- t9 W! ^! t- {8 k
     
0 z( m' O. [/ F2 j" |         
( l5 @2 M# c! I' R6 ^    }! }  M3 v, z/ {" R! Z* H  y8 R
. U7 I4 A- A1 G& v
    for (i = 0; i < OUT; i++)9 j( q' u4 f( `3 P  z
    {
, k! m  ?6 k3 O0 Q0 M9 x! Z         
! e* M) B( ~3 \9 H! r$ E; T% b        MinOut = MaxOut = Lc[0];& v& C% q1 @+ S8 k$ E/ ~9 i
        for (j = 0; j < DATA; j++)
1 k+ ~! _" s+ w1 ?        {8 W0 k6 G7 u$ B9 e' O5 T
            if (MinOut > Lc[j])
7 e( k# J; J7 [; S3 M% L- A, Y( T8 t/ d                MinOut = Lc[j];: X0 ]( u5 b' r7 I
            if (MaxOut < Lc[j])' |2 ]& t7 y; U! _% `
                MaxOut = Lc[j];8 q$ \- \, N, f8 H, k- E* W
        }) o. O/ }! Y: d# o
2 Y  D! w4 ?$ |9 B9 q
    }8 v4 P; d# k0 R0 Y
) z, X: B6 D1 `  L4 y. o
    //归一化
3 H! W" J  }: A4 U    for (i = 0; i < IN; i++)
5 G6 i) l7 f8 [3 e  q4 y        for (j = 0; j < DATA; j++)
3 y$ G  ^2 T' R: |- t            La[j] = (La[j] - MinIn + 1) / (MaxIn - MinIn + 1);& j+ M& C; N) A$ c
            
; Q1 W( h. y- f6 L( R' @6 O( p
* f' Y" ^( U5 x' t. i) Y& h0 |; X    for (i = 0; i < OUT; i++)) `% e, F" Z$ ^! J/ j* ?6 _& ~3 [
        for (j = 0; j < DATA; j++)/ I  h  N5 y4 W' g& {
            Lc[j] = (Lc[j] - MinOut + 1) / (MaxOut - MinOut + 1);9 }9 f! R0 B( t0 i5 ]% m' `
         % n! y0 m: S+ A
             % B6 E7 B' p" i/ O# J) ^5 L
& q$ K" \7 Q2 R; @0 j, u4 A
}
6 ]) p. t5 q, a" u: w4 r* h, pvoid getActiveVal(int dataIndex)
: _# u  C6 b9 ^# N' H3 B' h1 Q{
) U( P* o  `- t' R    int i, j;
- Z% {) y' `* g+ }  m6 b    double sum;% E6 l  \% C. d1 V7 I
    for (i = 0; i < NEURON; i++)
0 W$ m3 X' b$ {3 S( _7 f* K    {
% x/ C: N9 u$ |! ]) @& x6 I( v, t; V        sum = 0;8 u4 P9 Z3 N* O" [' l
        for (j = 0; j < IN; j++)- p( K- ?8 i4 A
            sum += Wab[j] * La[dataIndex][j];
* V( z+ w& W( E2 _         
' _& V# h. T! d0 n1 o        LbOut = Fx(sum);
  L1 M  D- A" F
7 Q; K$ }7 F6 M/ _2 {( ]    }
2 C4 B- S7 g& I- K+ E* T2 F2 e 8 @4 l8 g* n6 [
    for (i = 0; i < OUT; i++)# m; J4 L; S; ?
    {
6 b8 n3 X) e; i4 q3 `1 D/ ]& R        sum = 0;
1 |  N5 \, ]6 W# V) [# u: m' N        for (j = 0; j < NEURON; j++)
6 }! w+ `6 F0 R6 R2 ~# i            sum += Wbc[j] * LbOut[j];
- v7 J2 l; J8 t6 W7 A0 V         & z# h  @$ j9 ^1 q, y! d1 d% f7 v5 z
        LcOut = Fx(sum);
: i) `- s& P  r  \  g    }
4 u) ]9 J  `& o5 y}
+ V3 H( ?" M6 S0 L/ `void backUp(int dataIndex)
: D- H, ]0 `+ }1 y' W/ I{
# I* W: s' }4 B9 L- D8 f    int i, j;
' }% u, ?! b8 @" n  X    double sum = 0;
; t; M" w2 P8 ]. k; r    //Lc层单元的一般化误差6 A% T) p. Z6 w8 ]2 c  o
    for (i = 0; i < OUT; i++), f# @+ `5 }* L3 P! ^* o4 n6 _6 d# _
        Dc = LcOut * (1 - LcOut)*(Lc[dataIndex] - LcOut);+ t+ j4 z3 X/ U( l! m  L; i9 e6 C
; j2 O3 a. K  q' C% q
    //Lb层单元的一般化误差( f* u0 o# [! L
    for (i = 0; i < NEURON; i++)
7 j0 n" \3 A) f0 m1 v: P; Q    {
) g8 [) H: R( [  S1 W9 Z6 T        sum = 0;5 \5 C% r3 H3 V+ [
        for (j = 0; j < OUT; j++)" P) W0 Z* r+ Z* a
        {0 t* g5 r$ F2 g/ V" r
            sum += Wbc[j] * Dc[j];; m6 M( w6 [4 h/ n7 D
        }
) u, v# ?' e% g        Db = LbOut * (1 - LbOut) * sum;
) N) a' [6 t8 H! ^2 }    }
4 [  K# \0 u9 G! b' Y6 a 4 z1 E# R# N% V8 t" R
    double beta1 = 0.08, beta2 = 0.1;
0 }. y6 |" ^. v& B( W % s6 h: c" B8 c: h( J+ k+ [/ L' M" O
    for (i = 0; i < OUT; i++)
2 j+ E; r3 k  Q- r5 y        for (j = 0; j < NEURON; j++)
! w4 t: X! {$ J( @4 r; V            Wbc[j] += beta1*LbOut[j] * Dc;
" I9 K3 Y: S8 R& { 0 u1 T# G6 ^- O) Q+ w: T
    for (i = 0; i < NEURON; i++)
' }  k2 D# ^5 P        for (j = 0; j < IN; j++)
; i' i9 V: u+ p* E; d            Wab[j] += beta2*Db * La[dataIndex][j];
# w0 v  J# \) a& S" d7 h: C7 x. C
, u0 w3 l# F2 @     
9 Q3 N4 _$ b6 ^& x4 h     
' @1 V  o: ^# Q" {% @8 D' [% D}/ ]* ~" W! u, U& E4 E. b

$ @5 E  E2 p! X# l3 A) xdouble result(double d1, double d2)
0 J2 P9 S# t2 F: Q$ }' M% a{9 e+ G( j; h( U  [* z
    int i, j;( Q8 J. z. C% X$ P/ X- G( I  `$ u
    double sum;1 e# i& O1 y) E' p' I  p
    d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);;
" s. r  F- p3 X1 o0 h    d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);0 d9 Y; U7 A) \+ @8 e* C' N4 r

/ u2 D  ^9 L6 K" B: n; v/ J    for (i = 0; i < NEURON; i++)# ?' X# [- R; e2 u( g/ n
    {; h" ^& c- m$ W1 a0 h, X% F) g
        sum = 0;         % u- b, l# {3 i' s: e
        sum = Wab[0] * d1 + Wab[1] * d2 ;
* T5 t. B; F$ j  u' q; U/ l+ w6 E        LbOut= Fx(sum);3 C4 r6 Q1 n: L# w: j  f' P$ o
    }  E, A" s% h" \- r* U8 S; M

& `6 K+ L) Y6 z0 r2 x    sum = 0;
! f" l3 N3 m( i, I! }$ g    for (j = 0; j < NEURON; j++)6 T; m' C; ^2 a8 ?& x4 @% |) V
        sum += Wbc[0][j] * LbOut[j];0 r& [5 X1 T/ a/ F
     & [; ^0 Z, I& E* b
    LcOut[0] = Fx(sum);1 n) _7 W9 U' c, u2 W- G
     
3 F& S; U5 D$ W    return LcOut[0] * (MaxOut[0] - MinOut[0] + 1) + MinOut[0] + 1;5 H( J& J, q7 i

) p1 }/ ~3 J: A- _3 l8 }4 G& c
) y6 I$ A. G; \}
+ f5 _4 e. r6 cvoid train()' L8 o8 K- i* o! l2 x/ Z' d/ z
{
6 a9 D; u$ @- F- y# d. E1 I    int i, j, no = 0;! U  h: x2 A2 U3 y0 A( L
    double e = 0;! e* k$ {* M0 j$ M. x
    do{
; m) M9 W( L/ w! {; @2 g        e = 0;! v. z0 ?% D% ~: j) V
        for (i = 0; i < DATA; i++)
- p, _* J, q9 z9 N* i        {) h% G0 e: M% I. m5 k
            getActiveVal(i);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
) T) R' a' d1 e4 [            backUp(i);
* ]2 P3 G; E$ `" f            e += 0.5*pow((LcOut[0] - Lc[0]), 2);4 _# Y+ q! e! Q* D  h
        }
1 x3 Y6 k7 S* R$ c% _! n         3 j% _% F6 G; R9 Q0 D
        cout << no << " " << e << endl;+ T4 }1 W$ Q( `1 m
        no++;
" B) q% E4 [) e) [8 R  m1 Q) d' D    } while (no < 1000);
3 `' Q6 G) `4 a/ T& o ) I! |; t+ o. C6 d. f
4 W/ x9 _- v  \# g# F
}& [* W( j) Z. D6 G7 g

/ o# b  X4 q: k$ k, pvoid  main(int argc, char const *argv[])
" ]0 r5 F/ p4 X" }{" u- P, X# R# ^5 I+ j  h. c
     ) u9 I+ z! z; J7 y! E
    setSample();2 Y; N- a8 D# X# Q3 L1 E
    initNet();
) H6 F' g9 ~; ~- U( e5 K    train();( F: M4 `- \# g' R( }6 j
    double a, b;
6 x9 s; n3 R& ]+ \    while (1)
2 Q* l6 v  d9 O    {
  R) m  ^6 n' C' `: S& H! O        cout << "print two numbers" << endl;) z. ^2 N8 `: c2 ^! k8 h
        cin >> a >> b;
, A; s$ U- J# b2 k5 y        cout << "result:" << result(a, b) << endl;
- ^! ?0 S$ ?! V4 n  B    }
5 W# T- {) h8 w4 @  L" r     ( m4 q7 b" N3 t% c/ z$ ?5 _: J
     
; M; G6 }: m. i8 t3 x3 y" `# I}[/code]+ w, ]! w  r) b& j5 n% ]

0 s* g+ @4 C  R5 a( U+ n7 u




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