神经网络学习历程4.docx
《神经网络学习历程4.docx》由会员分享,可在线阅读,更多相关《神经网络学习历程4.docx(14页珍藏版)》请在冰点文库上搜索。
神经网络学习历程4
神经网络学习笔记4:
CPN网络的实现
分类:
人工智能2006-11-1916:
181791人阅读评论(0)收藏举报
对向传播网络(CounterPropagation),简称CPN,是将Kohonen特征映射网络与Grossberg基本竞争型网络相结合,发挥各自长处的一种新型特征映射网络,被广泛的运用于模式分类,函数近似,数据压缩等方面。
CPN网络分为输入层,竞争层,隐含层。
输入层与竞争层构成SOM网络,竞争层与输出层构成基本竞争型网络,从整体上看,CPN网络属于有教师学习型网络,而由输入层和竞争层构成的SOM网络又属于典型的无教师网络,因此,这一网络既汲取了无教师型网络分类灵活,算法简练的特点,又采纳了有教师型网络分类精确的长处,使两种不同类型的网络结合起来。
至于CPN网络的学习算法,这里不打算多提,有兴趣的请参考相关书籍。
这里给出一个简单的实现CPN网络的代码.
'程序实现功能:
CPN神经网络
'作 者:
laviewpbt
'联系方式:
laviewpbt@
'QQ:
33184777
'版本:
Version1.1.0
'说明:
复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议
PrivatemW1()AsDouble '隐含层的权值 S1 X R
PrivatemW2()AsDouble '输出层的权值 S2 X R
PrivatemErr()AsDouble '误差
PrivatemS1AsLong '隐含层的神经元个数 S1
PrivatemS2AsLong '输出层的神经元个数 S2
PrivatemRAsLong '输入层神经元个数 R
PrivatemGoalAsDouble '收敛的精度
PrivatemLrAsDouble '隐含层学习速度
PrivatemGamaAsDouble '输出层学习系数
PrivatemMaxEpochsAsLong '最大的迭代次数
PrivatemIterationAsLong '实际的迭代次数
'**************************************** 中间变量 *******************************************
PrivateHiddenOut()AsDouble '输出层的输出
PrivateOutCopy()AsDouble '比较的
PrivateTsAsLong '输入向量的总个数
PrivateInitializedAsBoolean '是否已初始化
'**************************************** 属性 *******************************************
PublicPropertyGetW1()AsDouble()
W1=mW1
EndProperty
PublicPropertyGetW2()AsDouble()
W2=mW2
EndProperty
PublicPropertyGetErr()AsDouble()
Err=mErr
EndProperty
PublicPropertyGetS1()AsLong
S1=mS1
EndProperty
PublicPropertyLetS1(ValueAsLong)
mS1=Value
EndProperty
PublicPropertyGetS2()AsLong
S2=mS2
EndProperty
PublicPropertyGetGoal()AsDouble
Goal=mGoal
EndProperty
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()
mLr=0.1
mGama=0.1
mGoal=0.0001
mMaxEpochs=1000
EndSub
'***********************************初始化参数 ***********************************
'
'函数名:
IniParameters
'参 数:
略
'说 明:
重新定义数组大小,初始化权值矩阵
'作 者:
laviewpbt
'时 间:
2006-11-17
'
'*********************************** 初始化参数 ***********************************
PrivateSubIniParameters(P()AsDouble,T()AsDouble)
DimiAsInteger,jAsInteger
mS2=UBound(T,1)
Ts=UBound(T,2)
mR=UBound(P,1)
ReDimmW1(mS1,mR)AsDouble
ReDimmW2(mS2,mS1)AsDouble
ReDimHiddenOut(mS1)AsDouble
ReDimOutCopy(mS2,Ts)AsDouble
ReDimmErr(mMaxEpochs)AsDouble
Fori=1TomSs
Forj=1ToTs
OutCopy(i,j)=T(i,j)'复制原始输出
Next
Next
Fori=1TomS1
Forj=1TomR
mW1(i,j)=Rnd '初始正向权值
Next
Next
Fori=1TomS2
Forj=1TomS1
mW2(i,j)=Rnd '初始反向权值
Next
Next
Initialized=True
EndSub
'***********************************训练函数 ***********************************
'
'函数名:
Train
'参 数:
P - 输入矩阵
' T - 对应的输出矩阵
'返回值:
采用CPN训练算法训练网络
'作 者:
laviewpbt
'时 间:
2006-11-19
'
'*********************************** 训练函数 ***********************************
PublicSubTrain(P()AsDouble,T()AsDouble)
DimiAsInteger,jAsInteger,kAsInteger,mAsInteger
DimMaxIndexAsInteger
DimSumAsDouble,MaxAsDouble,ErrAsDouble
IniParametersP,T '初始化数据
ReDimCopyP(mR,Ts)AsDouble
Fori=1TomR
Forj=1ToTs
CopyP(i,j)=P(i,j) '备份原始的输入数据,因为在训练中会破坏输入数据
Next
Next
Fori=1ToTs
Sum=0
Forj=1TomR
Sum=Sum+CopyP(j,i)*CopyP(j,i)
Next
Sum=Sqr(Sum)
Forj=1TomR
IfSum<>0Then '考虑到输入可能为[000]的形式
CopyP(j,i)=CopyP(j,i)/Sum '输入矩阵规一化处理
EndIf
Next
Next
mIteration=0
Fori=1TomMaxEpochs
mIteration=mIteration+1
Err=0
Forj=1ToTs
Fork=1TomS1
Sum=0
Form=1TomR
Sum=Sum+mW1(k,m)*mW1(k,m) '规一化连接权向量
Next
Sum=Sqr(Sum)
Form=1TomR
mW1(k,m)=mW1(k,m)/Sum
Next
Next
Fork=1TomS1
Sum=0
Form=1TomR
Sum=Sum+CopyP(m,j)*mW1(k,m) '计算隐含层的输出
Next
HiddenOut(k)=Sum
Next
Max=-0.01
MaxIndex=1
Fork=1TomS1
IfMax<=HiddenOut(k)Then '竞争
Max=HiddenOut(k)
MaxIndex=k
EndIf
Next
Fork=1TomS1
HiddenOut(k)=0
Next
HiddenOut(MaxIndex)=1 '将竞争获胜的神经元的输出置为1,其他为0
Fork=1TomR
mW1(MaxIndex,k)=mW1(MaxIndex,k)+mLr*(CopyP(k,j)-mW1(MaxIndex,k)) '隐含层权值调整
Next
Sum=0
Fork=1TomR
Sum=Sum+mW1(MaxIndex,k)*mW1(MaxIndex,k)
Next
Sum=Sqr(Sum)
Fork=1TomR
mW1(MaxIndex,k)=mW1(MaxIndex,k)/Sum'重新规一化权值
Next
Fork=1TomS2
mW2(k,MaxIndex)=mW2(k,MaxIndex)+mGama*(T(k,j)-OutCopy(k,j)) '输出层权值调整
Next
Fork=1TomS2
OutCopy(k,j)=mW2(k,MaxIndex) '计算网络输出
Err=Err+(T(k,j)-OutCopy(k,j))*(T(k,j)-OutCopy(k,j))
Next
Next
mErr(mIteration)=Sqr(Err)
IfmErr(mIteration) Next
EndSub
'***********************************仿真函数 ***********************************
'
'函数名:
Sim
'参 数:
P - 输入矩阵
'返回值:
返回对应的输出矩阵
'作 者:
laviewpbt
'时 间:
2006-11-19
'
'*********************************** 仿真函数 ***********************************
PublicFunctionSim(P()AsDouble)AsDouble()
DimiAsInteger,jAsInteger,TsAsInteger
DimMaxIndexAsInteger
DimSumAsDouble,MaxAsDouble
IfInitialized=FalseThenExitFunction
Ts=UBound(P,2)
ReDimCopyP(mR,Ts)AsDouble
ReDimHiddenOut(mS1)AsDouble
ReDimOut(mS2,Ts)AsDouble
Fori=1TomR
Forj=1ToTs
CopyP(i,j)=P(i,j) '复制原始数据
Next
Next
Fori=1ToTs
Sum=0
Forj=1TomR
Sum=Sum+CopyP(j,i)*CopyP(j,i)
Next
Sum=Sqr(Sum)
Forj=1TomR
IfSum<>0ThenCopyP(j,i)=CopyP(j,i)/Sum'将输入规一化
Next
Next
Fori=1ToTs
Forj=1TomS1
Sum=0
Fork=1TomR
Sum=Sum+CopyP(k,i)*mW1(j,k)
Next
HiddenOut(j)=Sum '隐含层输出
Next
Max=-0.01
MaxIndex=1
Forj=1TomS1
IfMax<=HiddenOut(j)Then
Max=HiddenOut(j)
MaxIndex=j
EndIf
Next
HiddenOut(MaxIndex)=1 '竞争获胜
Fork=1TomS2
Out(k,i)=mW2(k,MaxIndex) '输出
Next
Next
Sim=Out
EndFunction
'*********************************** 绘制误差曲线 ***********************************
'
'过程名:
DrawErrorCurve
'参 数:
pic - 曲线绘制的容器
' Color- 曲线的颜色
'作 者:
laviewpbt
'时 间:
2006-11-15
'
'*********************************** 绘制误差曲线 ***********************************
PublicSubDrawErrorCurve(picAsPictureBox,ColorAsOLE_COLOR)
pic.AutoRedraw=True
pic.Cls
pic.BorderStyle=0
pic.Scale(-0.15,1)-(1.1,-0.1)
pic.Line(-0.15,1)-(1.095,-0.095),vbBlue,B
DimMaxAsDouble,iAsLong
Fori=1TomIteration
IfMax Next
pic.Line(0,0)-(0,1),Color
pic.Line(0,0)-(1.1,0),Color
Fori=1TomIteration-1
pic.Line(i/mIteration,mErr(i)/Max)-((i+1)/mIteration,mErr(i+1)/Max),Color
Next
Fori=1To6
pic.CurrentY=-0.02
pic.CurrentX=0.2*(i-1)-pic.TextWidth(mIteration/5*(i-1))
pic.PrintCInt(mIteration/5*(i-1))
Next
Fori=1To6
pic.CurrentX=-0.13
pic.CurrentY=0.2*(i-1)-pic.TextHeight("5")+0.02
pic.PrintFormat(Max/5*(i-1),"0.00")
Next
pic.CurrentX=0.6-pic.TextWidth("误差曲线")
pic.CurrentY=0.95
pic.Print"误差曲线"
EndSub
'***********************************矩阵形式转为字符串 ***********************************
'
'函数名:
MatrixToString
'参 数: