乎乎 发表于 2007-12-18 12:22

提高BP神经网络泛化能力的方法

泛化能力也就是神经网络用于对未知数据预测的能力。

几种常用方法,大家探讨:

1、较多的输入样本可以提高泛化能力;
但不是太多,过多的样本导致过度拟合,泛化能力不佳;
样本包括至少一次的转折点数据。

2、隐含层神经元数量的选择,不影响性能的前提下,尽量选择小一点的神经元数量。
隐含层节点太多,造成泛化能力下降,造火箭也只要几十个到几百个神经元,拟合几百几千个数据何必要那么多神经元?

3、误差小,则泛化能力好;误差太小,则会过度拟合,泛化能力反而不佳。

4、学习率的选择,特别是权值学习率,对网络性能有很大影响,太小则收敛速度很慢,且容易陷入局部极小化;
太大则,收敛速度快,但易出现摆动,误差难以缩小;
一般权值学习率比要求误差稍微稍大一点点;
另外可以使用变动的学习率,在误差大的时候增大学习率,等误差小了再减小学习率,这样可以收敛更快,学习效果更好,不易陷入局部极小化。

5、训练时可以采用随时终止法,即是误差达到要求即终止训练,以免过度拟合;
可以调整局部权值,使局部未收敛的加快收敛;。

以上仅仅是个人的一点观点,其他的方法还有很多。

飞舟 发表于 2007-12-18 12:25

不懂这些,没法参与讨论,加分支持一下

rhinegold 发表于 2007-12-18 13:35

我也看不懂,这是关于什么的啊

lee__port 发表于 2007-12-18 14:44

比较深,路过

乎乎 发表于 2007-12-18 15:54

bp神经网络飞狐公式

{三层网络:输入层节点数=4,输出层节点数=1,隐含层节点数=隐含层
Sigmoid,Purelin,Trainlm}

INPUT: 隐含层(3,2,20,1),学习次数(2,1,100,1);
VARIABLE: 样本数=100, 首K线=DATACOUNT-样本数-3;
IF 首K线 < 1 THEN BEGIN
DRAWTEXTEX(ISLASTBAR,0,10,20,'股票上市时间太短,Κ线数量不足');
EXIT; {数据不足,直接退出}
END;

VARIABLE: 数据=(C+O)/2, 最大=HHV(数据,样本数+3), 数据=数据/最大; {数据归一化}
VARIABLE: 预测=0, 权值学习率=0.2, 阀值学习率=0.02, EPOCH=0, POS=0, I=0, J=0;
VARIABLE: 权值1[隐含层*4]=RAND(10000)/10000-0.5, 权值2[隐含层]=RAND(10000)/10000-0.5;
VARIABLE: 输出2[隐含层]=0, 阀值2[隐含层]=RAND(10000)/10000-0.5, 德特2[隐含层]=0;
VARIABLE: 输出3[样本数]=0, 阀值3=RAND(10000)/10000-0.5, 德特3=0, 误差=0, 要求误差=0.2;

FOR EPOCH=1 TO 学习次数*10 DO BEGIN {网络学习}
误差:=0;
FOR POS=1 TO 样本数 DO BEGIN
FOR J=1 TO 隐含层 DO BEGIN
输出2:=0;
FOR I=1 TO 4 DO 输出2:=输出2+数据[首K线+POS+I-2]*权值1[(J-1)*隐含层+I];
输出2:=1/(1+EXP(-输出2-阀值2)); {隐含层输出}
END;
输出3:=0;
FOR J=1 TO 隐含层 DO 输出3:=输出3+输出2*权值2;
输出3:=输出3-阀值3; {学习结果,输出层输出}

德特3:=数据[首K线+POS+3]-输出3;
误差:=误差+德特3*德特3; {计算误差}
FOR J=1 TO 隐含层 DO BEGIN
权值2:=权值2+权值学习率*德特3*输出2; {调整权值}
德特2:=德特3*权值2*输出2*(1-输出2);
FOR I=1 TO 4 DO 权值1[(J-1)*隐含层+I]:=权值1[(J-1)*隐含层+I]+权值学习率*德特2*数据[首K线+POS+I-2];
END;

阀值3:=阀值3+阀值学习率*德特3; {调整阀值}
FOR J=1 TO 隐含层 DO 阀值2:=阀值2+阀值学习率*德特2;
END;
误差:=误差/2;
IF 误差<=要求误差 THEN BREAK; {误差达到要求就退出,避免过度学习}
END;

{版权所有:嘉兴·陈(uuxp.com),QQ:110036737,Mail:cyouwei@zj.com}
FOR POS=1 TO 4 DO 预测:=数据[首K线+样本数-1+POS]; {取预测数据}
FOR POS=1 TO 样本数 DO 数据[首K线+POS+3]:=输出3;{返回学习结果}

FOR POS=1 TO 5 DO BEGIN {进行预测,共5个结果}
FOR J=1 TO 隐含层 DO BEGIN
输出2:=0;
FOR I=1 TO 4 DO 输出2:=输出2+预测*权值1[(J-1)*隐含层+I];
输出2:=1/(1+EXP(-输出2-阀值2));
END;
输出3:=0;
FOR J=1 TO 隐含层 DO 输出3:=输出3+输出2*权值2;
输出3:=输出3-阀值3;
FOR I=1 TO 3 DO 预测:=预测; {更换预测数据,提供下一次simulate}
预测:=输出3;
END;

BPNN: 数据*最大,COLORYELLOW; {学习结果}
误差值: 误差,COLORGRAY,LINETHICK0; {误差,要求不要过大或者过小;下面是预测结果}
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT1,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT2,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT3,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT4,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT5,COLORMAGENTA,PXUP8;

乎乎 发表于 2007-12-18 16:02

RBF神经网络飞狐公式

{三层网络:输入层节点数=4,输出层节点数=1,隐含层节点数=隐含层}
INPUT: 数据类型(4,1,4,1),隐含层(4,2,20,1),学习次数(2,1,100,1);
VARIABLE: 样本数=100, 首K线=DATACOUNT-样本数-3;
IF 首K线 < 1 THEN BEGIN
DRAWTEXTEX(ISLASTBAR,0,10,20,'股票上市时间太短,Κ线数量不足');
EXIT; {数据不足,直接退出}
END;
VARIABLE: 数据=IF(数据类型=4,C,IF(数据类型=2,H,IF(数据类型=3,L,O))), 最大=HHV(数据,样本数+4);
VARIABLE: 预测=0, 权值学习率=0.5, EPOCH=0, POS=0, 权值2[隐含层]=1, 输出2[隐含层]=0;
VARIABLE: 输出3[样本数]=0, 德特3=0, 误差=0, 要求误差=0.5;
VARIABLE: 重心[隐含层*4]=0, 距离[隐含层]=0, INCC=0, INTT[样本数]=0, NOTEND=1;
VARIABLE: I=0, J=0, K=0, Z=0, M=0, N=0, EZ=0.001, TD=0, TD0=0, D0=0, S2=0, S1=0;
数据:=数据/最大; {数据归一化}
FOR I=1 TO 隐含层 DO BEGIN
INCC:=I; FOR J=1 TO 4 DO 重心[(I-1)*隐含层+J]:=数据[首K线+I+J-2];
END;
WHILE NOTEND DO BEGIN
FOR I=1 TO 样本数 DO BEGIN
D0:=999999.9;
FOR J=1 TO 隐含层 DO BEGIN
S2:=0; FOR K=1 TO 4 DO S2:=S2+POW(数据[首K线+I+K-2]-重心[(J-1)*隐含层+K],2);
S2:=SQRT(S2);
IF S2<D0 THEN BEGIN D0:=S2; INTT:=J; END;
END;
END;
FOR I=1 TO 隐含层 DO BEGIN
距离:=999999;S2:=0;
FOR J=1 TO 样本数 DO BEGIN
IF INTT=I THEN BEGIN
D0:=0;
FOR K=1 TO 样本数 DO BEGIN
IF INTT=I AND J<>K THEN BEGIN
S2:=0;FOR Z=1 TO 4 DO S:=S+POW(数据[首K线+J+Z-2]-数据[首K线+K+Z-2],2);
S2:=SQRT(S2);
END;
END;
D0:=IF(D0+S2=0,1,D0+S2);
IF D0<距离 THEN BEGIN 距离:=D0;INCC:=J;FOR M=1 TO 4 DO 重心[(I-1)*隐含层+M]:=数据[首K线+J+M-2];END;
END;
END;
END;
TD:=0;FOR I=1 TO 隐含层 DO TD:=TD+重心;
IF ABS(TD-TD0)<EZ THEN NOTEND:=0; ELSE TD0:=TD;
END;

FOR EPOCH=1 TO 学习次数*10 DO BEGIN {网络学习}
误差:=0;
FOR POS=1 TO 样本数 DO BEGIN
FOR J=1 TO 隐含层 DO BEGIN
输出2:=0;FOR I=1 TO 4 DO 输出2:=输出2+POW(数据[首K线+POS+I-2]-重心[(J-1)*隐含层+I],2);
输出2:=1/(1+EXP(-输出2/(2*POW(距离,2)))); {隐含层输出}
END;
输出3:=0; {学习结果,输出层输出}
FOR J=1 TO 隐含层 DO 输出3:=输出3+输出2*权值2;

德特3:=数据[首K线+POS+3]-输出3;误差:=误差+POW(德特3,2); {计算误差}
FOR J=1 TO 隐含层 DO 权值2:=权值2+权值学习率*德特3*输出2*输出3; {调整权值}
END;
误差:=SQRT(误差);IF 误差<=要求误差 THEN BREAK; {误差达到要求就退出,避免过度学习}
END;

FOR POS=1 TO 4 DO 预测:=数据[首K线+样本数-1+POS]; {取预测数据}
FOR POS=1 TO 样本数 DO 数据[首K线+POS+3]:=输出3;{返回学习结果}

FOR POS=1 TO 5 DO BEGIN {进行预测,共5个结果}
FOR J=1 TO 隐含层 DO BEGIN
输出2:=0;FOR I=1 TO 4 DO 输出2:=输出2+POW(预测-重心[(J-1)*隐含层+I],2);
输出2:=1/(1+EXP(-输出2/(2*POW(距离,2))));
END;
输出3:=0;FOR J=1 TO 隐含层 DO 输出3:=输出3+输出2*权值2;
FOR I=1 TO 3 DO 预测:=预测; {更换预测数据,提供下一次simulate}
预测:=输出3;
END;

BPNN: 数据*最大,COLORYELLOW; {学习结果}
{MABP: MA(数据*最大,5);} {也可以做适当的平均}
误差值: 误差,COLORGRAY,LINETHICK0; {误差,要求不要过大或者过小;下面是预测结果}
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT1,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT2,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT3,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT4,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT5,COLORMAGENTA,PXUP8;

李萎峰傻臭 发表于 2007-12-18 16:57

huang2000 发表于 2007-12-18 18:25

目前数学界对SVM(支持向量机)应用在数据预报领域.神经网络与SVM可进行对比一下效果.

从所看到的一些资料结论来看SVM预报性能明显高于神经网络.

乎乎 发表于 2007-12-18 19:55

svm确实不错的,但到底怎样,我还没试过,有时间试试,多谢!

sgp111 发表于 2007-12-18 21:20

乎乎兄推荐的网站,www.macd.cn,我去看了,很受益,看了好几天看得都有点头晕了, 看来速成是不行了,但会坚持学习下去。再次道声谢谢!

[ 本帖最后由 飞舟 于 2007-12-19 12:07 编辑 ]

真实版陈滔滔 发表于 2007-12-19 11:57

居然有这样的帖子,像我这样只知杀人越货的贼寇哪能明白.

sgp111 发表于 2007-12-19 17:35

:) :) :) :) :) :)

[ 本帖最后由 sgp111 于 2007-12-20 23:07 编辑 ]

tianwen8 发表于 2007-12-21 12:35

不懂!不懂!

qqline 发表于 2017-1-11 21:48

:wanzuixiao:wanzuixiao:wanzuixiao:wanzuixiao:wanzuixiao

多好多好人头 发表于 2017-1-12 10:02

谢谢分享

liqiaoflying 发表于 2017-3-28 05:59

谢谢分享

liqiaoflying 发表于 2017-5-8 14:17

谢谢分享

liqiaoflying 发表于 2017-6-22 20:59

谢谢分享
页: [1]
查看完整版本: 提高BP神经网络泛化能力的方法