BP神经网络VB程序汇总Word文件下载.docx
《BP神经网络VB程序汇总Word文件下载.docx》由会员分享,可在线阅读,更多相关《BP神经网络VB程序汇总Word文件下载.docx(53页珍藏版)》请在冰豆网上搜索。
w(i)=2*Rnd-1
Forj=1To3
Fori=1To100
x(j,i)=4*(2*Rnd-1)
Nexti
sumx(j)=0
Nextj
'
求最值
Ifx(j,i)>
=Maxx(j)Then
Maxx(j)=x(j,i)
EndIf
Ifx(j,i)<
=Minx(j)Then
Minx(j)=x(j,i)
Temp=Temp+x(j,i)
sumx(j)=Temp
Temp=0
Meanx(j)=sumx(j)/100
归一化
IfMaxx(j)-x(j,i)>
=x(j,i)-Minx(j)Then
R=Maxx(j)-x(j,i)
Else
R=x(j,i)-Minx(j)
Datex(j,i)=(x(j,i)-Meanx(j))/R
期望输出
Fori=1To100
inputx(j)=Datex(j,i)
outputx(i)=2*(inputx
(1)+Sin(inputx
(2))+Exp(inputx(3)))
输出归一化
IfMaxd<
=outputx(i)Then
Maxd=outputx(i)
IfMind>
Mind=outputx(i)
Ex(i)=(outputx(i)-Mind)/(Maxd-Mind)
训练
Fors=1To5000Step1
time(s)=s
Forp=1To100
cishu(p)=p
Fori=1To3
MyIn(i)=Datex(i,p)
Fori=1To5
Temp=Temp+v(i,j)*MyIn(j)
s1(i)=Temp
y1(i,p)=1/(1+Exp(-s1(i)))
Temp=y1(i,p)*w(i)+Temp
s2=Temp
y2(p)=1/(1+Exp(-s2))
deltW(p)=(Ex(p)-y2(p))*y2(p)*(1-y2(p))
deltV(i,p)=deltW(p)*w(i)*y1(i,p)*(1-y1(i,p))
Nextp
误差
Temp=Temp+(Ex(i)-y2(i))^2
Errorx(s)=Temp
调整权值
Dw_1(i)=Dw(i)
Forj=1To100
Temp=Temp+deltW(j)*y1(i,j)
Dw(i)=Temp
Dv_1(i,j)=Dv(i,j)
Fork=1To100
Temp=Temp+deltV(i,k)*Datex(j,k)
Nextk
Dv(i,j)=Temp
w(i)=0.2*Dw(i)+0.2*Dw_1(i)+w(i)
Forj=1To5
v(j,i)=0.2*Dv(j,i)+0.2*Dv_1(j,i)+v(j,i)
画图
Picture1.Cls
Picture1.ScaleTop=1.5
Picture1.ScaleHeight=-2
Picture1.ScaleLeft=-10
Picture1.ScaleWidth=120
Picture1.Line(-9,0)-(110,0)
Picture1.Line(0,0)-(0,1.5)
Picture1.PSet(cishu(i),Ex(i)),RGB(128,128,0)
Picture1.PSet(cishu(i),y2(i)),RGB(128,0,0)
Fori=1To99
Picture1.Line(cishu(i),Ex(i))-(cishu(i+1),Ex(i+1)),RGB(128,128,0)
Picture1.Line(cishu(i),y2(i))-(cishu(i+1),y2(i+1)),RGB(128,0,0)
延时
Forj=1To1000
Fork=1To50
Picture2.Cls
Picture2.Prints
DoEvents
Nexts
"
form2.Command3.Enabled=True
form2.Command4.Enabled=True
泛化
Dimtest(1To3,1To20)AsSingle,sumE(1To3)AsSingle
DimMaxE(1To3)AsSingle,MinE(1To3)AsSingle,MeanE(1To3)AsSingle
DimMaxxEAsSingle,MinxEAsSingle
Dimdes(1To3)AsSingle,outE(1To20)AsSingle
DimMIn(1To3)AsSingle,s11(1To5)AsSingle,y11(1To5,1To20)AsSingle,s22AsSingle
DimDateE(1To3,1To20)AsSingle
Fori=1To20
test(j,i)=4*(2*Rnd-1)
Fori=1To20
Iftest(j,i)>
=MaxE(j)Then
MaxE(j)=test(j,i)
Iftest(j,i)<
=MinE(j)Then
MinE(j)=test(j,i)
Temp=Temp+test(j,i)
sumE(j)=Temp
MeanE(j)=sumE(j)/100
IfMaxE(j)-test(j,i)>
=test(j,i)-MinE(j)Then
R=MaxE(j)-test(j,i)
R=test(j,i)-MinE(j)
DateE(j,i)=(test(j,i)-MeanE(j))/R
求输出
Forp=1To20
Ti(p)=p
MIn(i)=DateE(i,p)
Temp=Temp+v(i,j)*MIn(j)
s11(i)=Temp
y11(i,p)=1/(1+Exp(-s11(i)))
Temp=y11(i,p)*w(i)+Temp
s22=Temp
y22(p)=1/(1+Exp(-s22))
输出及归一化
Forj=1To20
des(i)=DateE(i,j)
outE(j)=2*(des
(1)+Sin(des
(2))+Exp(des(3)))
IfMaxxE<
=outE(i)Then
MaxxE=outE(i)
IfMinxE>
MinxE=outE(i)
outD(i)=(outE(i)-MinxE)/(MaxxE-MinxE)
EndSub
PrivatemW1()AsDouble'
隐含层的权值S1XR
PrivatemW2()AsDouble'
输出层的权值S2XR
PrivatemB1()AsDouble'
隐含层的偏置值S1X1
PrivatemB2()AsDouble'
输出层的偏置值S2X1
PrivatemErr()AsDouble'
均方误差
PrivatemMinMax()AsDouble'
输入向量的上下限RX2
PrivatemS1AsLong'
隐含层的神经元个数S1
PrivatemS2AsLong'
输出层的神经元个数S2
PrivatemRAsLong'
输入层神经元个数R
PrivatemGoalAsDouble'
收敛的精度
PrivatemLrAsDouble'
学习速度
PrivatemGamaAsDouble'
动量系数
PrivatemMaxEpochsAsLong'
最大的迭代次数
PrivatemIterationAsLong'
实际的迭代次数
****************************************中间变量*******************************************
PrivateHiddenOutput()AsDouble'
隐含层的输出
PrivateOutOutput()AsDouble'
输出层的输出
PrivateHiddenErr()AsDouble'
隐含层各神经元的误差
PrivateOutPutErr()AsDouble'
输出层各神经元的误差
PrivatePdealing()AsDouble'
当前正在处理的输入
PrivateTdealing()AsDouble'
当前正在处理的输入对应的输出
PrivateOldW1()AsDouble'
旧权值数组
PrivateOldW2()AsDouble'
PrivateOldB1()AsDouble'
旧偏置值数组
PrivateOldB2()AsDouble'
PrivateTsAsLong'
输入向量的总个数
PrivateInitializedAsBoolean'
是否已初始化
****************************************属性*******************************************
PublicEventUpdate(iteration)
PublicPropertyGetW1()AsDouble()
W1=mW1
EndProperty
PublicPropertyGetW2()AsDouble()
W2=mW2
PublicPropertyGetB1()AsDouble()
B1=mB1
PublicPropertyGetB2()AsDouble()
B2=mB2
PublicPropertyGetErr()AsDouble()
Err=mErr
PublicPropertyGetS1()AsLong
S1=mS1
PublicPropertyLetS1(ValueAsLong)
mS1=Value
PublicPropertyGetS2()AsLong
S2=mS2
PublicPropertyGetR()AsLong
R=mR
PublicPropertyGetGoal()AsDouble
Goal=mGoal
PublicSubMinMax(Value()AsDouble)
mMinMax=Value
PublicPropertyLetGoal(ValueAsDouble)
mGoal=Value
PublicPropertyGetLr()AsDouble
Lr=mLr
PublicPropertyLetLr(ValueAsDouble)
mLr=Value
PublicPropertyGetGama()AsDouble
Gama=mGama
PublicPropertyLetGama(ValueAsDouble)
mGama=Value
PublicPropertyGetMaxEpochs()AsLong
MaxEpochs=mMaxEpochs
PublicPropertyLetMaxEpochs(ValueAsLong)
mMaxEpochs=Value
PublicPropertyGetiteration()AsLong
iteration=mIteration
****************************************初始化*******************************************
PrivateSubClass_Initialize()
mS1=5
mGoal=0.0001
mLr=0.1
mGama=0.8
mMaxEpochs=1000
***********************************训练***********************************
过程名:
Train
参数:
P-输入矩阵
T-输出矩阵
作者:
laviewpbt
时间:
2006-11-15
PublicSubTrain(P()AsDouble,T()AsDouble)
DimiAsLong,jAsLong,IndexAsLong
DimNmP()AsDouble
mR=UBound(P,1)'
输入向量的元素个数
mS2=UBound(T,1)'
输出层神经元的个数
Ts=UBound(P,2)'
输入向量的个数
NmP=CopyArray(P)'
保留原始的P,因为正规化的过程中会破坏原始数据
IniParametersNmP'
初始化参数和数组
mIteration=0
Fori=1TomMaxEpochs
mIteration=mIteration+1
Index=Int(Rnd*Ts+1)'
随机选取一个输入向量作为训练样本,这样效果比按顺序循环要好
Forj=1TomR
Pdealing(j)=NmP(j,Index)'
正在处理的输入向量
Next
Forj=1TomS2
Tdealing(j)=T(j,Index)'
正在处理的输出向量
HiddenLayer'
计算隐含层各神经元的输出
OutputLayer'
计算输出层各神经元的输出
OutError'
计算输出层各神经元的误差
HiddenError'
计算隐含层各神经元的误差
Update_W2B2'
更新隐含层至输出层之间的连接权及输出层节点的偏置值
Update_W1B1'
更新输入层至隐含层之间的连接权及隐含层节点的偏置值
IfiterationMod1000=0ThenRaiseEventUpdate(mIteration)
IfmErr(mIteration)<
mGoalThenExitSub'
达到要求,完成学习,退出
***********************************初始化数据***********************************
PrivateSubIniParameters(P()AsDouble)
DimiAsLong,jAsLong
ReDimmW1(mS1,mR)AsDouble,mW2(mS2,mS1)AsDouble
ReDimmB1(mS1)AsDouble,mB2(mS2)AsDouble
ReDimOldW1(mS1,mR)AsDouble,OldW2(mS2,mS1)AsDouble
ReDimOldB1(mS1)AsDouble,OldB2(mS2)AsDouble
ReDimHiddenOutput(mS1)AsDouble,OutOutput(mS2)AsDouble
ReDimHiddenErr(mS1)AsDouble,OutPutErr(mS2)AsDouble
ReDimPdealing(mR)AsDouble,Tdealing(mS2)AsDouble
ReDimmErr(mMaxEpochs)A