数学建模社区-数学中国
标题:
c语言实现BP神经网络算法
[打印本页]
作者:
syj52417
时间:
2015-4-24 18:21
标题:
c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!
. }+ @0 m1 @' H( K4 E
ps:不要吐槽语言。我知道这是c c++杂交体。[code=c]#include <stdio.h>
) g, ^: B1 H. x" m
#include <time.h>
. K' D f i0 X
#include <math.h>
) S# E. T4 [9 f
#include <stdlib.h>
1 f/ X9 }" S0 E
#include <iostream>
6 @+ L* H* Z% l" A
using namespace std;
% e9 b r6 j8 D( e
#define DATA 800
1 v, L( u0 U9 [4 o4 q
#define IN 2
, ?) R( M3 |- A; K! x. p
#define OUT 1
0 X& Q# c1 S3 H+ y! z5 F
#define NEURON 45
I( m6 J) J% e4 M& W: ?3 K, [* r
#define TRAINC 20000
7 ^. i' ]! A# o) c, O$ y" P2 m
' S6 @: ^: F }; I
double Fx(double x)
9 [; R! ]1 @: t6 I" y2 q4 b0 n0 L
{
- W% b2 u. d2 T- C$ D; p
return 1 / (1 + exp(-1 * x));
+ Z- k6 U' o8 Z4 X" L7 U2 c1 w
}
/ s# Y; X) f0 w( ?4 R
//La输入层 Lb隐藏层 Lc输出层
4 l4 X3 M! {4 i, X6 i) z& w
//样本输入
9 p3 t5 C, C( ~9 G, J
double La[DATA][IN];
; m, @9 T' ]* F9 T( W- U' P7 P
//样本输出
# |& [4 w3 |8 M, W
double Lc[DATA][OUT];
1 e4 X" r$ k, Q2 X6 i; N
//La->Lb权重
# q+ ^' D5 ^7 _' t1 D {3 o2 ?
double Wab[NEURON][IN];
% q+ o6 ]) q7 l' y5 H! q4 E, n
//Lb->Lc权重
3 D3 w0 R( O7 E
double Wbc[OUT][NEURON];
! k! v; T+ [4 V$ c. E
//样本输入每个向量的最小值,最大值;输出...
/ B& \) E0 H( M2 F# g4 d
double MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT];
5 w# h' C1 s# l9 ]' W; b9 o, r1 |
* g C' R+ O2 p4 ]8 C3 ?: r A8 O
//Lb层输出
# {7 t6 l! k+ t8 B
double LbOut[NEURON];
' d$ y. V. v% O$ y2 i
//Lc层输出
8 G+ g) E# h- V/ a! L
double LcOut[OUT];
0 i# i i* y! }- ]( R
4 a# b6 S7 {6 X5 o
//Lc层单元的一般化误差
% {- T' ]& t1 x$ H/ e* d5 p
double Dc[OUT];
& T, i: B. A7 r& w1 W7 G
//Lb层单元的一般化误差
4 r. L$ M6 v* U. m
double Db[NEURON];
1 m% r9 \' E) ]8 g1 `/ U
2 N+ ]$ X: c4 `* N: s& k2 V/ @ [
//设置样本数据
2 Y+ F. G; m& K$ u4 n2 a6 x8 w" t
void setSample()
) w7 `+ [( d6 B
{
V5 G1 D% ]7 L: x" M8 s2 J# Q
srand((unsigned)time(NULL));
! ]! ^% `* b5 q4 Q
int i, j;
; A& O" h. M h- c. W/ X8 Z% P
for (i = 0; i < DATA; i++)
8 f$ `' S0 @+ l; \4 P2 q
{
) t2 B% t: u! b& q" V7 w! N
for (j = 0; j < IN; j++)
. ~" J( |' s' G2 s- k8 N: a4 B
{
- J" e! d& V! [8 b' ? L9 [
La
[j] = rand() % 1000 / 10.0;
& C: a, \, u* ]8 f% F( e' u
}
3 u0 w$ i, r7 D5 ~9 a; _# ^
^" p1 |2 J& f; c! y
for (j = 0; j < OUT; j++)
% H) K; `8 {" b' T; Z3 p3 P7 R3 `, k
Lc
[j] = La
[0] + La
[1];
- ~, r0 f) @. |: ^
}
1 b9 v. [' ^. \
}
' m: T k! d `) `
//初始化BP网络:权重,阈值(隐含节点+输出节点)
8 y' Y0 V7 k9 X8 j6 b
void initNet()
6 @+ z+ Y, D% {/ t% f+ w* t: c# `& }1 A1 B
{
. g; h( J; A2 w l1 t7 K+ v W8 c
srand((unsigned)time(NULL));
9 ~% e) D( d N+ \8 N1 `8 F. Q
//两部分的权值设置随机值【-1,1】
! c9 c d4 [) S( M0 s; Y$ f
int i, j;
2 d1 o7 j( ?3 L* w$ O
for (i = 0; i < NEURON; i++)
- U# n' g5 W3 C$ F0 w# _% c6 i. S0 e0 x
for (j = 0; j < IN; j++)
- _6 ?1 o( q0 [0 M. Q" ^
{
' _) Y* S7 a# z* `) u
Wab
[j] = rand()*2.0 / RAND_MAX - 1 ;
7 u+ O$ q& c1 S
Wab
[j] /= 20;
$ b ?' w, J, M4 p7 ?* j
}
+ S4 y1 D, t# k/ \ o+ w! G
4 j4 W. u# ]: a% t2 L% g
for (i = 0; i < OUT; i++)
1 D' B7 o- X: \1 M8 v0 a3 i
for (j = 0; j < NEURON; j++)
2 \3 O7 J; T+ g, D# X2 F
{
% m J, l- z' O8 ?+ J
Wbc
[j] = rand()*2.0 / RAND_MAX - 1;
5 Y' H$ f7 L3 i6 n* F
Wbc
[j] /= 20;
2 A, |7 P5 Z& n4 r6 d0 y
}
- J+ [+ T; Q2 B" d* u
; @6 g% D* U: [' s% Z
//找出每个向量最小最大值,并进行归一化
$ C4 B j: K1 ]9 B$ L1 Y
for (i = 0; i < IN; i++)
2 M: P. T5 I- N$ f9 s
{
9 B, {! [" S0 ?7 p- P) X$ g) P* }3 B
, Q, t; h( g0 F9 Z5 f' w) w
MinIn
= MaxIn
= La[0]
;
: R9 X" d# e" R7 ~( B/ Q
for (j = 0; j < DATA; j++)
9 @" u* d: m) j% c: z( W# R. R
{
' i6 c8 t4 Y* V5 A2 R; s
if (MinIn
> La[j]
)
$ ^$ t7 c* S5 [ B3 A z V f
MinIn
= La[j]
;
1 F/ l5 V, M( ~1 \: m4 p* S
if (MaxIn
< La[j]
)
1 ^. M- K9 L0 `+ a0 _
MaxIn
= La[j]
;
. E& s% `2 L; b: m" E
}
# a: r3 R& `: m* j( d) ^
- A/ L! Z! f, [& F0 I8 ?7 O
|, V# Y' i" K3 w4 r0 e
}
, ]7 t2 @& x4 M! X g( v5 C
5 v& Z1 L8 i: w5 M" u% k
for (i = 0; i < OUT; i++)
: j; {9 R" N7 E% o! j
{
. d. W5 u1 ^3 [7 B' n# K5 ]6 h
3 {* |# R; L% C: d
MinOut
= MaxOut
= Lc[0]
;
) Y4 ~! N5 D0 |8 F
for (j = 0; j < DATA; j++)
& g7 A. K @1 T, r7 S
{
" q* q- R, K2 Q* f6 x6 O
if (MinOut
> Lc[j]
)
* Q3 C: v5 V- z1 D
MinOut
= Lc[j]
;
) ?1 I: z1 T* c- o1 Z8 O- J
if (MaxOut
< Lc[j]
)
8 H) y+ D. z/ o0 [5 z
MaxOut
= Lc[j]
;
: m' W: ]) }8 s1 A
}
) q7 J- Y* G: w& d7 Q Z
9 o1 i0 G& W4 U8 |/ W
}
6 z' [' R8 \% D& i s
9 J% h: f" [5 d% e; X8 Q2 L; s3 c
//归一化
/ ] ~' I$ Q) u: G5 l/ G( P& Q" f1 p
for (i = 0; i < IN; i++)
9 K1 @* O8 Q9 ^9 G/ c, ?" U P
for (j = 0; j < DATA; j++)
# Z) z* m) [( x/ ?7 E3 ~
La[j]
= (La[j]
- MinIn
+ 1) / (MaxIn
- MinIn
+ 1);
; o0 ?* {9 R. D2 `( K4 V
K; Q3 |9 g2 `5 c2 D
, T* I- y% c e# @$ l4 P, z
for (i = 0; i < OUT; i++)
8 d- v9 }0 K: H
for (j = 0; j < DATA; j++)
; t( \2 ]% f9 D1 u! N
Lc[j]
= (Lc[j]
- MinOut
+ 1) / (MaxOut
- MinOut
+ 1);
" X# x! C$ Y, Y" X1 b5 W5 J
' P& R$ X P; o' r
+ @( }5 V1 b- c; j
2 {) P7 ]1 s' ]9 i2 z2 A
}
7 V# j* v4 E- U! O# p5 G
void getActiveVal(int dataIndex)
# C5 B, ~6 k4 c7 O J9 G& K6 c
{
+ ?$ p. D8 ~/ H. B( e* n6 j1 k
int i, j;
9 d: Q z8 K. g$ |* |. V7 }$ F1 V
double sum;
) }/ {; u+ m# M
for (i = 0; i < NEURON; i++)
$ a+ k5 T- Y2 r. e5 h
{
! i q: R3 P/ C! E, K6 D. H+ |3 T
sum = 0;
/ ^# Y2 l& a e1 v) I7 `
for (j = 0; j < IN; j++)
+ H# K$ j X8 P% y' z+ @
sum += Wab
[j] * La[dataIndex][j];
& f5 a2 {8 f1 j) X
* N& m1 T7 e a* G9 }
LbOut
= Fx(sum);
& W4 s( l; ]! w- [! W: b* r# n% R
4 g! E! D! ]( a* \+ ]
}
5 I+ X3 s1 R5 u9 E$ x" w+ c
3 H2 _& D9 ^ M, p2 M
for (i = 0; i < OUT; i++)
$ F( {1 \! r! n! U) Y) V1 r/ m I) `
{
7 s& p$ K6 Z" Z; h! O
sum = 0;
, W5 X& F& C" _/ ]% E2 k
for (j = 0; j < NEURON; j++)
' G! _: ^. S) M: s0 p' d7 E" E
sum += Wbc
[j] * LbOut[j];
7 ~4 ]( {4 _3 H* V
' ^. p- T+ \$ q' d& `+ `7 U) A- a
LcOut
= Fx(sum);
2 s _8 O M" Y( u, V) s& ]
}
4 b/ z, |$ _ o
}
3 ~% u- u/ v @! Z
void backUp(int dataIndex)
9 `. K! R! C! b! T6 i* Q
{
$ ], w2 `4 b6 F: j- y
int i, j;
X/ K7 u8 a( P. d0 S! T0 y
double sum = 0;
5 U* U4 @- R( `
//Lc层单元的一般化误差
$ k9 b6 i" P, m0 J8 W' n
for (i = 0; i < OUT; i++)
& j) {5 o5 ?; B+ G8 g; i
Dc
= LcOut
* (1 - LcOut
)*(Lc[dataIndex]
- LcOut
);
/ ~% b O) D' x7 ~6 x+ F- [) u
& r* s2 Y+ W$ T3 q# B! W0 e
//Lb层单元的一般化误差
' @1 W' e" h$ R9 X; Z1 E$ X8 G1 f
for (i = 0; i < NEURON; i++)
$ X' o4 R3 W4 H* \
{
7 d) y* w- F! Z4 p. r& M- M' H
sum = 0;
6 [4 F. [ h. L1 }! K1 M
for (j = 0; j < OUT; j++)
8 u0 L x" ^( i& Q
{
% `( F0 b: T8 f( l1 \7 y! u
sum += Wbc[j]
* Dc[j];
. a$ ]% b x3 |! m$ `, D9 [
}
! L- E# Q3 {# W l
Db
= LbOut
* (1 - LbOut
) * sum;
/ K! ]6 N% ?" }" Q4 ]
}
0 e; s4 A" P* _) h4 V# L; u7 X
8 Y; C% m5 Q z
double beta1 = 0.08, beta2 = 0.1;
- X0 A# g8 z# i8 v# D
) @. {: z+ s0 B6 I' w7 }' e0 k
for (i = 0; i < OUT; i++)
3 n, i/ G( A: {9 U( v0 c" f
for (j = 0; j < NEURON; j++)
$ u& s! f! b7 E# i& w8 @- g) M
Wbc
[j] += beta1*LbOut[j] * Dc
;
& [2 u4 \ v: W8 H
: N; J8 @ T# l' P
for (i = 0; i < NEURON; i++)
8 t0 P" e1 o$ s4 N+ s( z* U% e
for (j = 0; j < IN; j++)
% t! w! K9 t0 n, n$ @6 P
Wab
[j] += beta2*Db
* La[dataIndex][j];
/ P7 {; U+ h& x" ]. X3 D3 F; C
1 [* w6 W3 g% b8 _6 l! C
5 g7 ]5 a5 q' R) t" r# \: t
! _: M3 V2 }9 S8 O- s7 q1 A
}
0 O# K9 o3 g# w3 p
; V# W5 \! ?6 v8 z
double result(double d1, double d2)
& [) Y/ Q" F6 u
{
Q; q- Q6 @8 X0 \& Z, R" f$ g& l
int i, j;
& l7 w- F0 D9 \4 J r5 h
double sum;
; u/ n' c/ n# m% p* N
d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);;
+ j* R3 E9 M" [ Z; {0 }9 w
d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);
7 q# p2 C, ^/ G
+ @ X. T) q( h2 s# ^
for (i = 0; i < NEURON; i++)
, Z0 ~& f1 T$ c* V
{
. q ~2 Y" W Y$ b8 _( N
sum = 0;
3 \+ |& d7 H3 h7 }8 L8 r: |1 C- G
sum = Wab
[0] * d1 + Wab
[1] * d2 ;
. _5 |% Z) p" d- u/ }4 Y4 g
LbOut
= Fx(sum);
# ]( k5 D- B4 Q" G
}
- R7 e$ R! N* ?
6 [/ g7 L2 ]* \8 B: k
sum = 0;
% _) _( C& W+ N* O, ]
for (j = 0; j < NEURON; j++)
# ~. g4 Y) G$ M5 `. i
sum += Wbc[0][j] * LbOut[j];
* r' J7 a' G+ e
) H3 [" p( \0 e2 u
LcOut[0] = Fx(sum);
# d" C( M- a: U3 u1 t. ~* V! g- W; d
% p# ?8 q! \: e$ j Y$ y" D
return LcOut[0] * (MaxOut[0] - MinOut[0] + 1) + MinOut[0] + 1;
# }* b2 |# {3 |- k
# l1 Q6 z' |8 p6 X3 q- V1 u b
" R* A( K) w o: J
}
" G% e: j$ I% L+ W# q
void train()
& r% l( I3 y# m. L! ]; _8 g
{
# j& b0 g/ L+ {+ i0 k
int i, j, no = 0;
% M7 m! ?4 q9 y% A) C, h
double e = 0;
, |% y3 x/ |: s9 O% t
do{
3 N( B6 H9 O8 k$ _/ k: K+ z3 _
e = 0;
! t; E2 [0 g, C, P9 w' H6 W# [; v
for (i = 0; i < DATA; i++)
+ m3 T: Y$ X: ^- A5 p) u
{
4 l" z- }0 ?3 O8 ]
getActiveVal(i);
; g9 B* a" ^( K% E( W
backUp(i);
9 _2 M" [5 I4 u% G
e += 0.5*pow((LcOut[0] - Lc
[0]), 2);
: {& D+ k5 S3 L
}
' H: c q4 @, X' H7 L# c
7 N6 @0 O9 Q+ q& I# C$ T# ^3 k6 H+ L
cout << no << " " << e << endl;
/ }, ^2 O9 I. ^* z
no++;
, H% e" G$ F! Q% p6 k
} while (no < 1000);
% n( k' G! p# B9 y' f! p9 d7 i
# V! l$ i' d! |- C7 b6 F7 U% p0 i
/ F l, S0 ~8 W) Y& _. d
}
" ]6 P1 f9 J" m! i" B$ E# k! ~5 Q
c) y K, D- y) I
void main(int argc, char const *argv[])
4 j7 C, C- k- n4 y/ O& m r& H. f
{
3 _/ t4 g0 b8 B. D' `0 p2 G
. u6 K' e* n) a: }5 i- y3 S, g
setSample();
: Z3 @8 T' Y: q' A9 `# m* l
initNet();
/ P2 A; S& v9 r5 O: f. _4 [
train();
1 ~0 m% {7 S8 u
double a, b;
# ]4 i& U1 h+ B; F/ G
while (1)
; q9 ?9 f" `7 c6 T; T
{
& }+ L+ e0 D% B7 d9 U- g
cout << "print two numbers" << endl;
1 Q9 `% E$ H9 U! u, z
cin >> a >> b;
. y) G0 G0 f2 l1 Z# G
cout << "result:" << result(a, b) << endl;
" X3 C; e- X6 ?7 y% U* P; p) g
}
+ Y9 ^, J/ @) e' w9 }8 l$ e
( s0 x- A q2 ]5 w4 u: q* ?/ _
; ?* F3 {' C0 h! W. C
}[/code]
* e! H D) C& t: J" Y E
b( W y' G; @, f. r
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5