- 金币:
-
- 奖励:
-
- 热心:
-
- 注册时间:
- 2007-12-14
|
|

楼主 |
发表于 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: 预测[4]=0, 权值学习率=0.5, EPOCH=0, POS=0, 权值2[隐含层]=1, 输出2[隐含层]=0;
VARIABLE: 输出3[样本数]=0, 德特3=0, 误差=0, 要求误差=0.5;
VARIABLE: 重心[隐含层*4]=0, 距离[隐含层]=0, INCC[4]=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]:=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[I]:=J; END;
END;
END;
FOR I=1 TO 隐含层 DO BEGIN
距离[I]:=999999;S2:=0;
FOR J=1 TO 样本数 DO BEGIN
IF INTT[J]=I THEN BEGIN
D0:=0;
FOR K=1 TO 样本数 DO BEGIN
IF INTT[K]=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<距离[I] THEN BEGIN 距离[I]:=D0;INCC[I]:=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+重心[I];
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[J]:=0;FOR I=1 TO 4 DO 输出2[J]:=输出2[J]+POW(数据[首K线+POS+I-2]-重心[(J-1)*隐含层+I],2);
输出2[J]:=1/(1+EXP(-输出2[J]/(2*POW(距离[J],2)))); {隐含层输出}
END;
输出3[POS]:=0; {学习结果,输出层输出}
FOR J=1 TO 隐含层 DO 输出3[POS]:=输出3[POS]+输出2[J]*权值2[J];
德特3:=数据[首K线+POS+3]-输出3[POS];误差:=误差+POW(德特3,2); {计算误差}
FOR J=1 TO 隐含层 DO 权值2[J]:=权值2[J]+权值学习率*德特3*输出2[J]*输出3[POS]; {调整权值}
END;
误差:=SQRT(误差);IF 误差<=要求误差 THEN BREAK; {误差达到要求就退出,避免过度学习}
END;
FOR POS=1 TO 4 DO 预测[POS]:=数据[首K线+样本数-1+POS]; {取预测数据}
FOR POS=1 TO 样本数 DO 数据[首K线+POS+3]:=输出3[POS]; {返回学习结果}
FOR POS=1 TO 5 DO BEGIN {进行预测,共5个结果}
FOR J=1 TO 隐含层 DO BEGIN
输出2[J]:=0;FOR I=1 TO 4 DO 输出2[J]:=输出2[J]+POW(预测[I]-重心[(J-1)*隐含层+I],2);
输出2[J]:=1/(1+EXP(-输出2[J]/(2*POW(距离[J],2))));
END;
输出3[POS]:=0;FOR J=1 TO 隐含层 DO 输出3[POS]:=输出3[POS]+输出2[J]*权值2[J];
FOR I=1 TO 3 DO 预测[I]:=预测[I+1]; {更换预测数据,提供下一次simulate}
预测[I]:=输出3[POS];
END;
BPNN: 数据*最大,COLORYELLOW; {学习结果}
{MABP: MA(数据*最大,5);} {也可以做适当的平均}
误差值: 误差,COLORGRAY,LINETHICK0; {误差,要求不要过大或者过小;下面是预测结果}
DRAWTEXT(ISLASTBAR,输出3[1]*最大,'·'),ALIGN0,SHIFT1,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3[2]*最大,'·'),ALIGN0,SHIFT2,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3[3]*最大,'·'),ALIGN0,SHIFT3,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3[4]*最大,'·'),ALIGN0,SHIFT4,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3[5]*最大,'·'),ALIGN0,SHIFT5,COLORMAGENTA,PXUP8; |
|
|