QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2693|回复: 0
打印 上一主题 下一主题

[问题求助] c语言实现BP神经网络算法

[复制链接]
字体大小: 正常 放大
syj52417        

1

主题

8

听众

2

积分

升级  40%

该用户从未签到

自我介绍
程序猿

社区QQ达人

跳转到指定楼层
1#
发表于 2015-4-24 18:21 |只看该作者 |正序浏览
|招呼Ta 关注Ta
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!* P; K' U1 ~  O4 p& H* P
ps:不要吐槽语言。我知道这是c c++杂交体。
  1. #include <stdio.h>
  2. # @4 o& e, b\" h/ V#include <time.h>
  3. 4 O; {8 t2 P( T, K  W) p3 @\" E#include <math.h>
  4. / f% r5 n3 u. {, C8 ^#include <stdlib.h>- G\" g1 P$ t& m/ e/ `2 I! y' i
  5. #include <iostream>
  6. 4 a- h0 G3 @+ ~1 tusing namespace std;
  7. 2 J) Y% S! G: w6 Z3 z4 O#define DATA  8003 ~  h# M  Y; v0 I' s
  8. #define IN 2' T5 U\" V: M) s: t  i7 o
  9. #define OUT 1; q% V' u\" Q  |& o; m5 j
  10. #define NEURON 45
  11. / f- b4 S( D6 u, J8 u5 d9 S#define TRAINC 20000, |1 W7 p- K3 Q( E\" B
  12. * S* U/ |\" a3 B7 L- |' L& m+ H
  13. double Fx(double x)' T  i0 P1 ~: g5 h) [/ T' u
  14. {+ ^5 d\" d* i, N; M5 T
  15.     return 1 / (1 + exp(-1 * x));9 Z4 {0 M7 b; Y4 v  k6 r
  16. }) f, T; o8 b7 t8 T
  17. //La输入层  Lb隐藏层  Lc输出层1 L6 x- o9 Q( N2 c
  18. //样本输入
  19. & }& W1 k( e6 jdouble La[DATA][IN];
  20. 8 J6 v1 q& N  V' z4 b//样本输出* I. `( g1 W. i
  21. double Lc[DATA][OUT];4 r+ O( P. r7 z! Z+ p' d
  22. //La->Lb权重
  23. 8 m4 X( g4 \( k5 a! L, l+ \6 tdouble Wab[NEURON][IN];9 T0 Q* u1 ^, U# o5 m! j
  24. //Lb->Lc权重
  25. 0 |( i6 z# W2 k6 I4 I# D4 u  |double Wbc[OUT][NEURON];
  26. + a* Q3 ~\" ^) W\" T\" q, @0 D//样本输入每个向量的最小值,最大值;输出...& s4 L! t. ?6 s1 ]
  27. double MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT];& k' |1 |* D+ V9 Y0 e9 ~
  28. & b  @, [* C% o/ W/ \' C
  29. //Lb层输出( d* n5 ^6 c+ i3 M5 h
  30. double LbOut[NEURON];
  31.   Z' z/ n  S5 F0 g, R+ q//Lc层输出
  32. ! y* j8 Q6 S7 K8 D! A- Pdouble LcOut[OUT];1 s5 e; ^; v5 {) w
  33. + ]0 c  [% g$ `
  34. //Lc层单元的一般化误差
  35. . }0 Y3 X# I  p+ u5 B8 K6 tdouble Dc[OUT];\" ]) \- i! y/ S6 x
  36. //Lb层单元的一般化误差; ~) ]* Q6 |) n6 k$ W5 I% m* _
  37. double Db[NEURON];
  38. , f4 H* Z# Y/ ?( P
  39. * K- Q3 ?% j0 [5 f- t2 |//设置样本数据6 d% a% j8 I5 o\" W5 T: m; o8 v7 a
  40. void setSample()* x) q& X/ {9 V0 z( ~* K2 @
  41. {
  42. & d& g' I5 J, ?) Y    srand((unsigned)time(NULL));, i% h) q. f2 ^* k4 s: N
  43.     int i, j;# J! G, \6 \8 _* A
  44.     for (i = 0; i < DATA; i++); R: K, G: i7 Q1 Q+ c\" J6 U
  45.     {
  46. $ _$ w' p; G( e3 y2 Y' n& u        for (j = 0; j < IN; j++)
  47. , D% I; U. ?2 ~4 ^\" |2 A$ b2 V        {0 p+ P: `8 P1 I: F! q
  48.             La[j] = rand() % 1000 / 10.0;
  49. & R& b  I8 E% Z+ V6 U: Y, L+ C        }. W5 C\" U# s6 ~/ m+ Y
  50. 8 U; v3 l' i9 n& _4 f
  51.         for (j = 0; j < OUT; j++)
  52. \" o* y# c) n1 j& h1 a            Lc[j] = La[0] + La[1];* \) n$ m! U# C+ _. {6 L
  53.     }
  54. ( R  d7 L5 g  y}
  55. : q$ T* j  q  P! [//初始化BP网络:权重,阈值(隐含节点+输出节点)+ S; y3 X9 E0 G\" H& E3 S
  56. void initNet()! o% ^2 m% q' u* M5 m, ?
  57. {2 s% I' [: I9 c( \% ^; `. T
  58.     srand((unsigned)time(NULL));
  59. 3 i3 W' d- \: @4 E4 A    //两部分的权值设置随机值【-1,1】( @5 @, y6 n; k2 s
  60.     int i, j;
  61. 2 u$ `% i- Z+ e! |    for (i = 0; i < NEURON; i++)5 q3 ]* B9 ]; N! |1 T
  62.         for (j = 0; j < IN; j++). {- N6 C+ e# z7 L
  63.         {
  64. . n& Z% H) {8 O* L# }            Wab[j] = rand()*2.0 / RAND_MAX - 1 ;1 E* ~) i' I% i! n4 D  g
  65.             Wab[j] /= 20;5 S6 q. s- D4 T, l% ?8 h0 E3 p
  66.         }
  67. 3 C$ X( X6 X0 h  Q
  68. ! S) f' T( V. y, H+ S, q7 A    for (i = 0; i < OUT; i++)
  69. / ~% Q3 d/ p, k: H4 s# [\" t% S4 T7 g        for (j = 0; j < NEURON; j++)! w: U4 x3 A( }; \0 b: }7 c
  70.         {\" `/ D( Q& C7 H, q7 t
  71.             Wbc[j] = rand()*2.0 / RAND_MAX - 1;! J# v: F. m/ R, f4 B\" ^( V: o
  72.             Wbc[j] /= 20;
  73. ! v$ l& {' \- T% `        }3 i( }$ c! |1 b3 f& u
  74.      * n& F\" S* r: N
  75.     //找出每个向量最小最大值,并进行归一化
  76. 9 W5 P% v5 V/ p/ X+ r    for (i = 0; i < IN; i++)% m. Z% K& f. h6 b; c# K1 V) s
  77.     {4 O- [0 s+ ?- w: u, [
  78.          & t! p* X! ]5 p; D) p
  79.         MinIn = MaxIn = La[0];\" O1 r; A4 e) `+ p- I3 U
  80.         for (j = 0; j < DATA; j++)
  81. ; t1 L4 O5 m' u4 h        {& A! Q  O9 c7 w9 Z
  82.             if (MinIn > La[j])$ |1 V. W- O& u5 A- e6 I3 I1 P+ }4 _
  83.                 MinIn = La[j];
  84. , @' Z6 n& Z2 Q& I$ h, p. v2 j& B            if (MaxIn < La[j])6 f/ y# h\" Y6 B# b/ ?
  85.                 MaxIn = La[j];9 D3 Q4 T( c7 {- t+ C\" u% \
  86.         }
  87. ' e% G, M. `: Z5 K( u     
  88. . ~- B' S  M# x6 A: ?  b, t) [! K         ( q0 p1 m( Z$ z) y' R; d9 K
  89.     }
  90. ! T+ m7 j' |* `: u 1 c8 G  T: x5 c/ @' r, Y6 Z) i
  91.     for (i = 0; i < OUT; i++)4 ]0 K$ O+ L: a+ g7 u
  92.     {
  93. , a6 Y& H5 S* r, A3 |2 }. r7 |         3 \& \3 ^7 X2 a9 Q4 f6 Z# b$ g
  94.         MinOut = MaxOut = Lc[0];5 o6 n1 {( }\" l% ?  N8 J
  95.         for (j = 0; j < DATA; j++)6 q% c1 t2 w& i\" |; q$ `
  96.         {1 y2 E5 t) h2 x/ T2 z\" C2 e3 ?8 @% q
  97.             if (MinOut > Lc[j])
  98. ) e5 c! r\" J4 @0 M                MinOut = Lc[j];
  99. ) d/ g; C& J3 h\" o% {            if (MaxOut < Lc[j])\" C4 q/ U( r5 b7 t# O- _
  100.                 MaxOut = Lc[j];$ c- I4 G+ n2 G; n) l. r& s, v
  101.         }
  102. $ M$ |8 Y9 t' v2 E5 |7 R) }$ S 5 M% K! `. o, V, }6 m& r& X  w
  103.     }/ m4 g* @$ P5 X+ L/ z

  104. # }7 y( V6 N. K2 p, h    //归一化
  105. % H) H5 h' l# C: |    for (i = 0; i < IN; i++)
  106. # b* X8 I- [4 l: M! R3 C; \        for (j = 0; j < DATA; j++)) G7 |# _; X, X, [/ {+ @' U' ^
  107.             La[j] = (La[j] - MinIn + 1) / (MaxIn - MinIn + 1);& T8 P! r8 |  Q2 e& k% b
  108.             
  109. # B9 v* I: i8 U' k 5 U3 M5 a  A& M2 t0 x; Z
  110.     for (i = 0; i < OUT; i++)' F# O* G# \; ], S, R  r% p
  111.         for (j = 0; j < DATA; j++)
  112. - ~! k8 Q9 M8 @) l  [6 [; z            Lc[j] = (Lc[j] - MinOut + 1) / (MaxOut - MinOut + 1);
  113. # d\" U. a1 O+ u6 i1 i- f5 n2 |         % K* N% l( h0 u* b$ p
  114.             
  115. + {) ~9 {3 I, v- R 5 Y1 J. Q; E% n
  116. }8 ]0 G  K! Z\" B\" r. y: u
  117. void getActiveVal(int dataIndex)) Y  D/ r7 u8 E& R\" n# `) T4 j8 N
  118. {1 k4 K; X  ~  [! r
  119.     int i, j;
  120. & @8 T2 Y& W# @4 @# z    double sum;, B+ I, U5 Q# I5 ^  ~7 v  e6 \/ Z
  121.     for (i = 0; i < NEURON; i++)/ B; P+ o$ c, [+ s
  122.     {/ v0 R* B3 x( b! m0 k: a4 g' W
  123.         sum = 0;
  124. 4 u9 e) [1 ~+ b        for (j = 0; j < IN; j++)
  125. ' F7 k\" K5 v5 @            sum += Wab[j] * La[dataIndex][j];
  126. # Z3 w+ ?1 a$ ^( D% w0 B         
  127. 2 e2 S\" R$ n0 H        LbOut = Fx(sum);% l- ?9 |0 N+ o& y* X& ?

  128. 2 {! J. ?  K/ O/ z' T7 M' b\" J; y    }
  129. / |+ {4 _( Q1 \4 I! O8 I ! |. _7 e+ j. k6 `\" }+ t
  130.     for (i = 0; i < OUT; i++)* g) M, W0 ^2 h( p9 [# t( z* V! F4 m
  131.     {8 E0 a0 V8 L# B0 Y6 ?
  132.         sum = 0;5 d* K* a) q) `9 o; l
  133.         for (j = 0; j < NEURON; j++)
  134. ! ?3 f1 S) A. @8 B3 Z; M% i. H; T            sum += Wbc[j] * LbOut[j];
  135. 3 I3 y6 t4 r2 }7 P5 X$ S! Y         
  136. % q; W! g: G9 E$ {& i7 B        LcOut = Fx(sum);
  137. 0 E  I. N6 A& `, S. k, o( s    }
  138. ; `3 P: z& ?! w& p3 v* ?}
  139. 9 B3 K\" ^5 t4 F* S3 xvoid backUp(int dataIndex); T# W2 a9 @! g: ^  K$ p! l6 k
  140. {- f3 k\" T/ ?$ Z0 Y3 ]6 w# a
  141.     int i, j;6 e* e9 j0 |% `; ^- j
  142.     double sum = 0;
  143. 5 R: x+ s/ f\" i; E% P& \    //Lc层单元的一般化误差; I; o( m1 L& o1 q\" `: `% `
  144.     for (i = 0; i < OUT; i++)
  145. & x' d0 l3 j+ \: d        Dc = LcOut * (1 - LcOut)*(Lc[dataIndex] - LcOut);0 E, x  p5 L; V

  146. 6 Q2 ^) f0 p( T$ R, ^* K% _' g    //Lb层单元的一般化误差
  147. 1 k6 i& i) s2 `) _5 W    for (i = 0; i < NEURON; i++)
  148. 3 @. n3 W, ^6 d1 L4 i+ d) ]    {
  149. / H4 G3 B5 ?! a7 C' }        sum = 0;\" m& q3 a9 O\" U% l7 X
  150.         for (j = 0; j < OUT; j++)( v2 g! m( j4 [
  151.         {
  152. 2 ?, V9 i4 _% L: e8 Z- i; E            sum += Wbc[j] * Dc[j];
  153. & @9 y7 @3 ^; W        }
  154. 8 E- ]% b/ O4 q% C5 m        Db = LbOut * (1 - LbOut) * sum;
  155. 0 D2 p- \7 Q8 g0 u8 G    }- g\" ?- j/ k! c' X; W- t
  156.   n8 w) J. s5 W\" Y- p6 [6 y/ a; T
  157.     double beta1 = 0.08, beta2 = 0.1;
  158. / |! l8 G7 C8 O  |
  159. 8 C2 _0 r\" d+ S* j& j; j    for (i = 0; i < OUT; i++)
  160. ' ?& g9 n0 j+ F4 s! a' i4 D* K        for (j = 0; j < NEURON; j++)& e6 A2 V9 W% I
  161.             Wbc[j] += beta1*LbOut[j] * Dc;
  162. - N/ y; _9 c1 ]# j/ G0 w
  163. % l* O9 z( l( Q7 A8 B* U. }    for (i = 0; i < NEURON; i++)( z- y- U( e' _
  164.         for (j = 0; j < IN; j++)# e, }! _, f: b' J
  165.             Wab[j] += beta2*Db * La[dataIndex][j];
  166. 2 [$ E- ?* @) l2 O7 b$ B / Y* i* W. _1 D6 i* z- c: {5 }( v: Y
  167.      6 m3 q! ]2 i0 C- h3 i
  168.      ) o( v\" b7 g7 x, V- r7 y7 ]
  169. }
  170. 3 L4 i1 e3 i% j* y4 I7 U  ] ! Z. s0 l, y% L9 K6 B
  171. double result(double d1, double d2)& r: z* i2 z$ b! |\" w  W) c. l+ V* r
  172. {
  173. ' f7 V1 x* |6 M- K) o2 ]+ O9 F    int i, j;
  174. 7 p/ T% g( o- J\" u4 \    double sum;\" W* C, R  F- g- m2 a
  175.     d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);;
  176. 1 V9 W# C, [- Z* y( C* H    d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);  E\" ]7 w* }9 T+ S# Z

  177. ! g* v6 h% H% p  v9 \: O3 V    for (i = 0; i < NEURON; i++)4 v7 j8 F1 U. T/ a\" B4 m# l$ s
  178.     {
  179. ( N6 v/ h) p7 b        sum = 0;         6 s4 E0 ^0 P$ |5 T1 E2 b' T
  180.         sum = Wab[0] * d1 + Wab[1] * d2 ;$ m4 f9 T7 b6 @# ?\" U1 S+ X5 o
  181.         LbOut= Fx(sum);
  182. 4 p$ ~. U+ e0 s) ~' w7 D! ?- ~9 E3 c    }; G' ?0 h5 z0 E; u

  183. 7 X( G; \! `& N% w    sum = 0;
  184. + I/ v; f& D8 \( w! p9 f    for (j = 0; j < NEURON; j++)
  185. - l  A% V% X/ a6 i- V        sum += Wbc[0][j] * LbOut[j];3 \9 R  ^. P: L4 N1 E. Z
  186.      4 G2 O  v- g! \! J
  187.     LcOut[0] = Fx(sum);
  188. / X% w- Z9 k$ m\" \! k+ O0 J     
  189. : w5 H) W0 h\" C* j/ w    return LcOut[0] * (MaxOut[0] - MinOut[0] + 1) + MinOut[0] + 1;
  190. # r; F7 q  t  y$ l ' ]8 k0 D  ~) L2 N7 ?! y+ j

  191. 9 V- \# x# S' t/ ]1 H  O}( {$ j$ W) V. j% e
  192. void train()
  193. 6 m1 o1 d6 X0 f/ Q{, J% c9 F  Y% U! @6 h
  194.     int i, j, no = 0;
  195. / }. y+ Z8 w5 C9 Q( C$ J  H9 u    double e = 0;
  196. ) N6 ~! r! S: K. m    do{) f7 Q% H4 q\" g\" I
  197.         e = 0;
  198. 8 f\" _$ W1 Q- f4 j2 F        for (i = 0; i < DATA; i++)3 X) x# Z& f1 y* X! H4 z$ L  k
  199.         {
  200. $ F/ ], `( S* l: Q; i            getActiveVal(i);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                , I\" B: @( p  v) \5 u  F
  201.             backUp(i);* m! d7 s9 q- l  I# ?' ~- F% K8 |: P
  202.             e += 0.5*pow((LcOut[0] - Lc[0]), 2);: U% g! `0 x\" [/ @3 @$ k
  203.         }' }% ]% U  H4 z) e\" T( m8 `+ |
  204.          ) H5 z  A  L, p8 }9 G
  205.         cout << no << " " << e << endl;) H' t& P$ k\" o! j
  206.         no++;
  207. ' s2 O6 e3 @  P4 D    } while (no < 1000);
  208.   O7 D/ [\" M  `6 H- ]+ b ( P& _  ?$ I9 W- S6 ?8 I

  209. - N* A$ u\" r9 k1 m, Z' @6 M# P}- o: Y9 ?$ a$ S  ?8 j* ~; K
  210. # ]' b\" o: X+ ]3 P' ?9 X
  211. void  main(int argc, char const *argv[])% q. d' G' ^6 @# N' r
  212. {
  213. ) u/ |' {9 z$ x& Z     
  214. 5 V9 m& m& m6 E; V0 H/ h    setSample();  O' ?0 Y6 c. u) O
  215.     initNet();, l8 I7 c8 g4 v
  216.     train();
  217. 8 ~3 I% M& U6 a2 E5 j/ E+ B    double a, b;
  218. & g4 j' b8 p/ `- v$ g6 b    while (1)
  219. 2 `, I% Y9 |5 X; A) ~- ~    {
  220. $ D, e* b/ L8 y2 F        cout << "print two numbers" << endl;
  221. * C' m& Q& G6 t1 c2 V; G# N        cin >> a >> b;; F6 i8 `/ K; N6 i' `$ p! Z! N8 G! n: W; r
  222.         cout << "result:" << result(a, b) << endl;3 c% y* [& p9 ^0 ?( P) t' i
  223.     }
  224. , R# d  W3 t; I( J8 V* O     
  225. * ~6 Y0 B% Y( O( b     / i! I  n* z: b  p; f
  226. }

% c- ^: R1 S$ v+ G3 x1 V
: p. b" P5 f- P# I. _
zan
已有 1 人评分体力 收起 理由
苍松绿竹 + 1 赞一个!

总评分: 体力 + 1   查看全部评分

转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

fastpost qq
收缩
  • 电话咨询

  • 04714969085

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-11-1 00:45 , Processed in 0.268622 second(s), 63 queries .

回顶部