数学建模社区-数学中国
标题:
c语言实现BP神经网络算法
[打印本页]
作者:
syj52417
时间:
2015-4-24 18:21
标题:
c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!
" \0 z1 E" a, w
ps:不要吐槽语言。我知道这是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; d
using namespace std;
- Z, Y5 N& J+ S
#define DATA 800
% F: p, z1 T) o% e; z
#define IN 2
7 D3 W& N2 i% E R2 v
#define OUT 1
. D5 c6 c& X @* J
#define NEURON 45
1 x1 ^4 X5 k) }
#define TRAINC 20000
" A( b- k# j: a4 F! K
: ?: q* D) h( Q9 F7 U
double 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/ D
double Lc[DATA][OUT];
/ @7 X2 r6 D$ ]4 O' J
//La->Lb权重
& s2 F/ V* U3 h8 L+ M2 n0 v
double 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 P
void 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+ |, x
void 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' o
void 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