由于这种算法在本质上是一种神经网络学习数学模型所.docx
- 文档编号:25034523
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:20
- 大小:84.10KB
由于这种算法在本质上是一种神经网络学习数学模型所.docx
《由于这种算法在本质上是一种神经网络学习数学模型所.docx》由会员分享,可在线阅读,更多相关《由于这种算法在本质上是一种神经网络学习数学模型所.docx(20页珍藏版)》请在冰豆网上搜索。
由于这种算法在本质上是一种神经网络学习数学模型所
反向传播算法也称BP算法。
由于这种算法在本质上是一种神经网络学习的数学模型,所以,有时也称为BP模型。
BP算法是为了解决多层前向神经网络的权系数优化而提出来的;所以,BP算法也通常暗示着神经网络的拓扑结构是一种无反馈的多层前向网络,它含有输人层、输出层以及处于输入输出层之间的中间层。
中间层有单层或多层,由于它们和外界没有直接的联系,故也称为隐层。
在隐层中的神经元也称隐单元。
隐层虽然和外界不连接.但是,它们的状态则影响输入输出之间的关系。
这也是说,改变隐层的权系数,可以改变整个多层神经网络的性能。
'程序实现功能:
模拟QQ截屏
PrivatemW1()AsDouble '隐含层的权值 S1 X R
PrivatemW2()AsDouble '输出层的权值 S2 X R
PrivatemB1()AsDouble '隐含层的偏置值 S1 X 1
PrivatemB2()AsDouble '输出层的偏置值 S2 X 1
PrivatemErr()AsDouble '均方误差
PrivatemMinMax()AsDouble '输入向量的上下限 R X 2
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
EndProperty
PublicPropertyGetB1()AsDouble()
B1=mB1
EndProperty
PublicPropertyGetB2()AsDouble()
B2=mB2
EndProperty
PublicPropertyGetErr()AsDouble()
Err=mErr
EndProperty
PublicPropertyGetS1()AsLong
S1=mS1
EndProperty
PublicPropertyLetS1(ValueAsLong)
mS1=Value
EndProperty
PublicPropertyGetS2()AsLong
S2=mS2
EndProperty
PublicPropertyGetR()AsLong
R=mR
EndProperty
PublicPropertyGetGoal()AsDouble
Goal=mGoal
EndProperty
PublicSubMinMax(Value()AsDouble)
mMinMax=Value
EndSub
PublicPropertyLetGoal(ValueAsDouble)
mGoal=Value
EndProperty
PublicPropertyGetLr()AsDouble
Lr=mLr
EndProperty
PublicPropertyLetLr(ValueAsDouble)
mLr=Value
EndProperty
PublicPropertyGetGama()AsDouble
Gama=mGama
EndProperty
PublicPropertyLetGama(ValueAsDouble)
mGama=Value
EndProperty
PublicPropertyGetMaxEpochs()AsLong
MaxEpochs=mMaxEpochs
EndProperty
PublicPropertyLetMaxEpochs(ValueAsLong)
mMaxEpochs=Value
EndProperty
PublicPropertyGetiteration()AsLong
iteration=mIteration
EndProperty
'**************************************** 初始化 *******************************************
PrivateSubClass_Initialize()
mS1=5
mGoal=0.0001
mLr=0.1
mGama=0.8
mMaxEpochs=1000
EndSub
'*********************************** 训练 ***********************************
'
'过程名:
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) '正在处理的输出向量
Next
HiddenLayer '计算隐含层各神经元的输出
OutputLayer '计算输出层各神经元的输出
OutError '计算输出层各神经元的误差
HiddenError '计算隐含层各神经元的误差
Update_W2B2 '更新隐含层至输出层之间的连接权及输出层节点的偏置值
Update_W1B1 '更新输入层至隐含层之间的连接权及隐含层节点的偏置值
IfiterationMod1000=0ThenRaiseEventUpdate(mIteration)
IfmErr(mIteration) Next EndSub '*********************************** 初始化数据 *********************************** 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)AsDouble Randomize Fori=1TomS1 mB1(i)=2*Rnd-1 Forj=1TomR mW1(i,j)=2*Rnd-1 Next Next Fori=1TomS2 mB2(i)=2*Rnd-1 Forj=1TomS1 mW2(i,j)=2*Rnd-1 Next Next NormalizeInputP Initialized=True EndSub '*********************************** 输入数据影射到-1和1之间 *********************************** PrivateSubNormalizeInput(P()AsDouble) DimiAsInteger,jAsInteger,mAsInteger,nAsInteger m=UBound(P,1): n=UBound(P,2) Fori=1Tom Forj=1Ton P(i,j)=2*(P(i,j)-mMinMax(i,1))/(mMinMax(i,2)-mMinMax(i,1))-1 Next Next EndSub '*********************************** 隐含层的数据 *********************************** PrivateSubHiddenLayer() DimiAsLong,jAsLong DimSumAsDouble Fori=1TomS1 Sum=0 Forj=1TomR Sum=Sum+mW1(i,j)*Pdealing(j) Next HiddenOutput(i)=1/(1+Exp(-(Sum+mB1(i)))) Next EndSub '*********************************** 输出层的数据 *********************************** PrivateSubOutputLayer() DimiAsLong,jAsLong DimSumAsDouble Fori=1TomS2 Sum=0 Forj=1TomS1 Sum=Sum+mW2(i,j)*HiddenOutput(j) Next OutOutput(i)=Sum+mB2(i) Next EndSub '*********************************** 输出层的误差 *********************************** PrivateSubOutError() DimiAsLong,jAsLong,MseAsDouble Fori=1TomS2 OutPutErr(i)=Tdealing(i)-OutOutput(i) Mse=Mse+OutPutErr(i)*OutPutErr(i) Next mErr(mIteration)=Sqr(Mse/mS2) '用某次迭代的均方误差来代替整体的均方误差 EndSub '*********************************** 隐含层的误差 *********************************** PrivateSubHiddenError() DimiAsLong,jAsLong DimSumAsDouble Fori=1TomS1 Sum=0 Forj=1TomS2 Sum=Sum+OutPutErr(j)*mW2(j,i) Next HiddenErr(i)=Sum*(HiddenOutput(i))*(1-HiddenOutput(i)) Next EndSub '*********************************** 更新输出层的权值和偏置值 *********************************** PrivateSubUpdate_W2B2() DimiAsLong,jAsLong DimTempAsDouble Fori=1TomS2 Forj=1TomS1 Temp=mLr*OutPutErr(i)*HiddenOutput(j)+mGama*OldW2(i,j)'动量学习方法 mW2(i,j)=mW2(i,j)+Temp OldW2(i,j)=Temp Next Temp=mLr*OutPutErr(i)+mGama*OldB2(i) mB2(i)=mB2(i)+Temp OldB2(i)=Temp Next EndSub '*********************************** 更新隐含层的权值和偏置值 *********************************** PrivateSubUpdate_W1B1() DimiAsLong,jAsLong DimTempAsDouble Fori=1TomS1 Forj=1TomR Temp=mLr*HiddenErr(i)*Pdealing(j)+mGama*OldW1(i,j) mW1(i,j)=mW1(i,j)+Temp OldW1(i,j)=Temp Next Temp=mLr*HiddenErr(i)+mGama*OldB1(i) mB1(i)=mB1(i)+Temp OldB1(i)=Temp Next EndSub '*********************************** 均方误差 *********************************** 'PrivateFunctionMse(P()AsDouble,T()AsDouble)AsDouble 'DimTemp()AsDouble 'DimiAsInteger,jAsInteger,SumAsDouble,SubsAsDouble 'Temp=Sim(P) 'Fori=1TomS2 'Forj=1ToTs 'Subs=Temp(i,j)-T(i,j) 'Sum=Sum+Subs*Subs 'Next 'Next 'Mse=Sum/mS2/Ts 'EndFunction '*********************************** 复制数组 *********************************** PrivateFunctionCopyArray(P()AsDouble)AsDouble() CopyArray=P EndFunction PublicFunctionSim(P()AsDouble)AsDouble() DimiAsInteger,jAsInteger,kAsInteger DimRAsInteger,TAsInteger DimHiddenOut()AsDouble,OutOut()AsDouble,NmP()AsDouble R=UBound(P,1): T=UBound(P,2) ReDimHiddenOut(mS1,T)AsDouble,OutOut(mS2,T)AsDouble IfInitialized=FalseThenExitFu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 由于 这种 算法 本质上 一种 神经网络 学习 数学模型