数学建模社区-数学中国
标题:
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# C
double 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* y
double 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 a
double 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 J
void 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