数学建模社区-数学中国
标题:
c语言实现BP神经网络算法
[打印本页]
作者:
syj52417
时间:
2015-4-24 18:21
标题:
c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!
. }, I8 P5 K+ E) j) c% W" m
ps:不要吐槽语言。我知道这是c c++杂交体。[code=c]#include <stdio.h>
: ^- i! H* m' Q( |4 J* o
#include <time.h>
. y& U8 w$ ?$ T% U6 H
#include <math.h>
0 D2 _ Y$ |' _9 v
#include <stdlib.h>
0 d7 c3 I9 v0 f v. x8 [5 z! m7 ^
#include <iostream>
! w/ `: ^2 a) \8 S$ o- V! A+ x
using namespace std;
, M9 P, g; D! U
#define DATA 800
' E$ T# V# t( ~# [2 a- m
#define IN 2
( o# [( O) A+ X8 \9 A7 Z# F
#define OUT 1
7 G" f. t8 [/ Y2 \ u( V
#define NEURON 45
7 i( N' K3 w6 v/ ~ F+ S' x
#define TRAINC 20000
7 a% X z" w- D% T
$ o' Y5 P i, N7 a9 r; _4 S8 s- p
double Fx(double x)
' F; d- c6 M7 i4 T. y
{
$ C, \6 n9 M& B- ]4 s
return 1 / (1 + exp(-1 * x));
4 K7 S0 `+ K9 Y5 `5 p1 G5 g
}
6 p4 I% }8 Q, F+ {4 U
//La输入层 Lb隐藏层 Lc输出层
7 f: [, r4 W. D2 m1 Z7 {: h
//样本输入
( g/ ]/ x4 C; g0 o- n
double La[DATA][IN];
4 k. I# J8 B1 H3 R9 z5 m$ _
//样本输出
( p* {5 Z" k: t% w) i
double Lc[DATA][OUT];
8 w" r5 M2 L& X e7 ?( P
//La->Lb权重
1 C7 I# V2 C+ V0 j. \7 R
double Wab[NEURON][IN];
- o0 q. R$ {/ ~7 }
//Lb->Lc权重
" |5 Y2 }, @* \. @3 U/ F; U9 Z, H9 C, [
double Wbc[OUT][NEURON];
! ?0 s0 y$ q. L: h$ L
//样本输入每个向量的最小值,最大值;输出...
9 v( ?* t) V; @: N$ a# [
double MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT];
+ k1 b3 S$ g4 t
) Z; r+ f# J! _: ]# J
//Lb层输出
* l" R& \3 K9 `' d. g
double LbOut[NEURON];
* Q R8 R% u6 h1 [; S. h* U
//Lc层输出
& Y5 Z: g2 x, w2 N
double LcOut[OUT];
/ \9 f$ U% s0 [) J% U8 G
+ U E, v+ m3 ^4 m* ~
//Lc层单元的一般化误差
8 a; z: U) i9 j& v
double Dc[OUT];
7 H; V t; O+ E) A V
//Lb层单元的一般化误差
& A3 J: T; P8 c0 _- H( D \% a0 [" H
double Db[NEURON];
- ~& Z# C6 S1 N: {/ H: {) b
7 M& R Z. f m' v# `; C' k
//设置样本数据
" C& `& v6 J! A
void setSample()
! c. Q, |; l6 p1 P5 u7 P7 v$ |
{
' V8 X5 t Z! U
srand((unsigned)time(NULL));
3 r6 @& u) z" u# Z) Y7 y& C
int i, j;
2 N( Y- g1 M2 a
for (i = 0; i < DATA; i++)
K: g+ x& R: N8 X4 ~3 d* Y v
{
1 ^7 x0 J* y; ` G+ _! m( l5 [
for (j = 0; j < IN; j++)
; {4 J! u6 F U5 `4 }3 X
{
. ~2 }5 G- G3 O7 X }
La
[j] = rand() % 1000 / 10.0;
, w* G4 T3 m! Y5 T( _
}
5 N( Z, V8 f( }. Y- F
4 e5 W1 B. U: u: }: _* c
for (j = 0; j < OUT; j++)
& A4 |1 |/ a$ I O
Lc
[j] = La
[0] + La
[1];
% f' q. J! o+ v3 `6 H/ v7 p; O
}
) V: D4 E* I6 I) W1 d* P8 ]- ~* h5 D
}
: T) M7 S8 R9 V- i& @' J! U7 m/ V
//初始化BP网络:权重,阈值(隐含节点+输出节点)
( v5 h) P1 V+ _) \" }
void initNet()
" g' E' N! A9 P; K$ j( u$ O: w
{
" H6 r0 W; O6 X# m4 t# a) ?
srand((unsigned)time(NULL));
6 w1 G" E" x# o5 ~* k! x; N2 Y0 i5 D
//两部分的权值设置随机值【-1,1】
( U) ?$ K. q z# g5 B, I7 N
int i, j;
* j n4 \* g/ Q
for (i = 0; i < NEURON; i++)
+ U( y: ^ T. ^; T
for (j = 0; j < IN; j++)
- b% y- J' Z: n3 r" e& M
{
8 q% L, d! P# K- ~& i. l
Wab
[j] = rand()*2.0 / RAND_MAX - 1 ;
. t. \ `# Z8 j* k
Wab
[j] /= 20;
' K1 K2 X8 N- ?* U
}
, k1 W8 K, J) c5 |, Y# s; z
- b' D+ y- `' X( o
for (i = 0; i < OUT; i++)
; M% y/ `/ i( o& |+ a3 P% K
for (j = 0; j < NEURON; j++)
" M2 @; O4 x/ ?" n" x. \
{
, W' u* x; d5 q O
Wbc
[j] = rand()*2.0 / RAND_MAX - 1;
- }9 @+ |4 k, h( C" ]
Wbc
[j] /= 20;
2 G, w( ^+ |, b1 A7 w! L
}
$ I3 O, { _- I+ q- C& ^' a$ y
) p" p! R" G* w9 P8 k
//找出每个向量最小最大值,并进行归一化
G7 {. n, O, f
for (i = 0; i < IN; i++)
9 T' w. t, `+ a- e. @
{
, _; y; c# f! T7 B. S/ ]1 Q
N7 i4 }$ X* q
MinIn
= MaxIn
= La[0]
;
; j+ j, p3 M9 F0 G0 a5 z
for (j = 0; j < DATA; j++)
' c+ f+ s3 O! N, s x$ x
{
4 b4 W; W5 A! Z5 A# M' p
if (MinIn
> La[j]
)
2 I4 k0 C" L# [6 J1 S: h
MinIn
= La[j]
;
9 U' G- h$ ] e7 h/ D
if (MaxIn
< La[j]
)
+ i, S* I. ?; o5 j5 g" |) D0 \7 X
MaxIn
= La[j]
;
3 C2 M/ p+ V2 K9 N8 K
}
' a. y' o, w X$ O' s# N+ [8 F! a
* }9 W$ g# ]& V1 K9 [. z
* F/ i$ H" R( z4 c6 I o
}
: N9 e7 F& [+ u/ S
' G5 `/ u1 v. i: G! @* e& p+ [) g/ G; F) e
for (i = 0; i < OUT; i++)
9 h( K( X8 Y1 I5 o7 y* f" t
{
" c* a( x3 V$ e, h! y
3 E3 B O7 [: A) W' N, c
MinOut
= MaxOut
= Lc[0]
;
. b7 }% a3 X9 g" d3 c* O
for (j = 0; j < DATA; j++)
6 g8 h& k3 M; Y* e1 Z7 o
{
$ H7 ^ F' e" X2 q! j& ^
if (MinOut
> Lc[j]
)
5 l- ~. c2 X$ ?4 U7 J
MinOut
= Lc[j]
;
; s3 a1 O: P* R/ U
if (MaxOut
< Lc[j]
)
- s# O/ l& G; K& n2 J- k( |2 A% o' N
MaxOut
= Lc[j]
;
7 g W3 o+ t% w9 q1 W1 ]: E
}
; {# r3 e2 T7 W$ p
7 p0 a/ b3 r& C1 B2 K/ o% |8 o
}
$ [- W. o" I& p ?7 K. }# c/ S5 x
' }- V6 s2 a- l( p" Z) m
//归一化
& |6 {5 Q, i1 s
for (i = 0; i < IN; i++)
. v) h f' r& U- s# S/ ?
for (j = 0; j < DATA; j++)
. d# L( B" k! H" [
La[j]
= (La[j]
- MinIn
+ 1) / (MaxIn
- MinIn
+ 1);
: t* G& r& _& c0 m; W. p
- X, A1 V* U2 H* e, n
" H8 s- A5 F2 [* }/ j" g. q
for (i = 0; i < OUT; i++)
, L6 [, U# Y2 R5 Y; B: P
for (j = 0; j < DATA; j++)
/ R q( D ?9 d
Lc[j]
= (Lc[j]
- MinOut
+ 1) / (MaxOut
- MinOut
+ 1);
, ~4 N5 w: J) W% n1 S
2 E+ @% o) K% A) H/ R
+ X' p: E7 C/ ^2 _' `
# Y- r8 K8 G8 i- z- V
}
) d- T- m" M: e" ~) T5 \
void getActiveVal(int dataIndex)
, B4 t2 S5 J t/ F6 R2 H
{
- L' z& I P+ q- R
int i, j;
( k% k9 t$ m6 f4 E5 A
double sum;
4 a1 O6 M& `/ m p6 X" X
for (i = 0; i < NEURON; i++)
; w# z2 k# \4 R: D2 q
{
5 x$ t, h, t. o5 ~( o3 r
sum = 0;
0 Z4 {3 H) A3 y) D
for (j = 0; j < IN; j++)
) t2 ?3 Y( E+ C7 v4 S9 @/ V6 H0 ^
sum += Wab
[j] * La[dataIndex][j];
2 T& E9 H" f0 V- M* S
! U" M8 `- }5 p" U
LbOut
= Fx(sum);
9 N6 P l$ c0 C, n% C" x1 z
5 X U. w% n/ z8 k- _% k8 |
}
) U- x/ Y) f) e/ A6 ^+ {, d
. t: f7 M# L% `/ n* c
for (i = 0; i < OUT; i++)
z7 H% _! |8 F: J8 m% V% {( J' u
{
( u/ q v- Y; {7 V- S7 p3 `
sum = 0;
, G0 y% w7 u7 l' L
for (j = 0; j < NEURON; j++)
- `! m: x4 W0 p& R, S/ X
sum += Wbc
[j] * LbOut[j];
* _ [3 G) G, X; t: S
2 h- H; S; |# v4 H$ c5 v$ p+ R9 A
LcOut
= Fx(sum);
1 V; b' B- C) }% F3 t
}
t- Q; X/ J. O2 @
}
$ I( b1 U5 R) b# s4 V
void backUp(int dataIndex)
$ r+ [8 X& y+ E9 u# w
{
8 F; D5 B v+ A! ]3 _3 M/ e2 t
int i, j;
4 G7 \$ S* @5 B$ Y! n0 ?2 \) y( z/ y
double sum = 0;
1 F4 M0 a, q& Z! E* V }# J3 E
//Lc层单元的一般化误差
# l: ^7 \! q3 i$ h4 ^9 |
for (i = 0; i < OUT; i++)
, D) N( G" W) z9 P1 t+ U
Dc
= LcOut
* (1 - LcOut
)*(Lc[dataIndex]
- LcOut
);
9 E% F; k# f4 k* O6 [ D
! f! k; V) P( N# ]
//Lb层单元的一般化误差
; o7 M; @5 t* g( A! F
for (i = 0; i < NEURON; i++)
; ]& A2 K" }/ F4 d
{
" O8 I2 l: ^, a& x% ^0 O7 H& E# s
sum = 0;
, g7 O8 v2 P2 `% t
for (j = 0; j < OUT; j++)
- x) I8 z# I& Q o+ W
{
n2 @0 @" v' h9 M) ]5 e
sum += Wbc[j]
* Dc[j];
/ u: n) J2 D9 @
}
& F% K) h7 M( L/ E
Db
= LbOut
* (1 - LbOut
) * sum;
/ p& U" _4 m! i( D* [+ e7 _
}
: D7 R, e1 j1 h. i3 Z/ @" d
8 R! u2 U3 \: ]4 Y# ~
double beta1 = 0.08, beta2 = 0.1;
J7 L2 y3 G$ Q# i8 l
" Q! Q) _; Q9 g! W0 d1 k
for (i = 0; i < OUT; i++)
/ R3 Q% h. V4 |) V1 y
for (j = 0; j < NEURON; j++)
7 j$ n! g( G6 _( c* G( t" ]" L# A8 ~
Wbc
[j] += beta1*LbOut[j] * Dc
;
* i2 H% t% |! Z I/ m; I% k7 U) Z# _
/ e) B0 }: M. i9 y1 t( f2 z
for (i = 0; i < NEURON; i++)
1 v. O- g0 S- A
for (j = 0; j < IN; j++)
, l* S, ]) `+ L" |$ V( P
Wab
[j] += beta2*Db
* La[dataIndex][j];
+ d6 i" n* U& C) F' }) E, e
0 `1 m7 |9 U) E& D+ o J' z
- ?# D5 I9 J W" Z1 a& u
6 S9 l" f. W* W; j# z$ z+ b
}
& `6 ^8 {; `: v
! e& |; f# K* L. p3 K4 e& W1 A
double result(double d1, double d2)
3 e# f# [& e6 I m6 P- c
{
5 S2 V2 a7 q5 U. z; D" e
int i, j;
4 W* |5 L# U" T
double sum;
+ X4 B- S7 |3 n1 o, u4 u
d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);;
% s5 X: w: X1 r1 }6 g
d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);
$ m6 G8 r! ~5 i
" a, J! j' b; U3 W2 {) b* }
for (i = 0; i < NEURON; i++)
4 K6 _7 S' E _6 F/ x
{
3 J# o2 O; D4 X" Q) m2 M5 K
sum = 0;
5 `# a0 v$ R* j* F; k
sum = Wab
[0] * d1 + Wab
[1] * d2 ;
" a" M6 ?! [# Y! K9 B: ~, `5 ]) m
LbOut
= Fx(sum);
: E6 f. {* ~* y8 n+ v( V" z1 d
}
8 Y n5 r% P, t# |% W8 H
N: z& r }% j
sum = 0;
# Y7 H3 A3 [2 x8 o+ D
for (j = 0; j < NEURON; j++)
) z) Z! b7 K) ^. h
sum += Wbc[0][j] * LbOut[j];
! U& L$ g) o+ p. S! W! m
0 C% a7 H; L/ A7 y
LcOut[0] = Fx(sum);
$ V5 B$ c2 Z. z, ~
# ]3 Q! ^7 G4 _8 [3 G$ N
return LcOut[0] * (MaxOut[0] - MinOut[0] + 1) + MinOut[0] + 1;
- [5 S# o2 Z- O$ m, X$ G+ m1 D
9 n9 J3 R6 [6 I7 C8 w: E8 d
4 s3 G2 j3 e) W1 b9 L) D" p
}
9 y1 N! a( A3 M. }* _3 R
void train()
' Y5 y+ S/ j# l/ R
{
8 Q( Z- r2 Q$ I) E. |& ?
int i, j, no = 0;
; b; H! K4 F$ P" E/ u
double e = 0;
0 A4 L9 @# F d* T' l
do{
# _6 T' X0 W8 r# I6 @' w+ @4 f
e = 0;
# ?4 T' k* D) y8 z8 Q
for (i = 0; i < DATA; i++)
! c* ~. O* W+ z. v' n9 X
{
; u- X* j: }7 h- X% G
getActiveVal(i);
! r G ]6 i0 @- K6 [
backUp(i);
3 h5 s* Z( B. M% W; E
e += 0.5*pow((LcOut[0] - Lc
[0]), 2);
3 |0 ^) x7 G3 e! H1 l3 r0 {
}
* p* ?. N8 S* b* [; F
! w6 _1 g4 d- S5 m$ @
cout << no << " " << e << endl;
* M$ r) V5 e- K; `; O3 q. B
no++;
3 ^+ x; d% r% \) w7 J
} while (no < 1000);
3 j( c8 `( O6 f/ }
/ K6 g6 {1 z) p& w
8 X0 }5 v* I6 Y4 v4 h6 o" u
}
" D6 [* {' c4 x
% e$ v) B1 t; @9 K
void main(int argc, char const *argv[])
' f$ r" D* p, w' p+ r9 {) J
{
8 e* U f; Q& h4 l
/ ?) ?; E7 F1 W0 G5 c8 [
setSample();
( B9 b, ^/ K! |8 c ^4 e& }" n, x6 o
initNet();
; I3 p8 j! T( s! Q% I" @
train();
; w5 b# z( f. F+ M7 v2 V
double a, b;
7 {/ p: t. Q3 a: k6 X @
while (1)
2 m' b* z: u# F0 m
{
# V- ~% M2 R5 D+ O1 B
cout << "print two numbers" << endl;
2 r/ V; q% `) C
cin >> a >> b;
( p; ]4 J$ G0 y' D9 l4 E! C
cout << "result:" << result(a, b) << endl;
: s; Y3 k3 p- F7 m, V
}
5 e# [ j! Q" m4 P! m e u
$ F) h0 ~) B, J
' M0 w; i3 e9 B; b5 C
}[/code]
0 X! w8 ~1 ?7 c+ V5 _& D
5 s- f% m" W' V; b0 v) a# p% Q- y
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5