C# BP程序.docx
《C# BP程序.docx》由会员分享,可在线阅读,更多相关《C# BP程序.docx(17页珍藏版)》请在冰豆网上搜索。
C#BP程序
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.IO;
usingSystem.Text;
usingSystem.Data;
namespaceNN_HYL
{
classNN
{
intk=100,Tk=30,jj=0;
intNi=4,No=1,time=10000,Nh;
double[,]W1,W2,deltaW1,deltaW2,betaO,betaH,Ohidden,Ooutput;
double[]thrH,thrO,deltathrH,deltathrO;//p;
doubler,eps,a,P;
publicNN()
{
Nh=3;
r=2.5;
eps=0.01;
a=1;
W1=newdouble[Ni,Nh];
W2=newdouble[Nh,No];
deltaW1=newdouble[Ni,Nh];
deltaW2=newdouble[Nh,No];
betaO=newdouble[k,No];
betaH=newdouble[k,Nh];
Ohidden=newdouble[k,Nh];
Ooutput=newdouble[k,No];
thrH=newdouble[Nh];
thrO=newdouble[No];
deltathrH=newdouble[Nh];
deltathrO=newdouble[No];
//p=newdouble[k];
}
protectedList>m_XExamples;//输入训练样本
protectedList>m_YExamples;//输出训练样本
publicboolXY()
{
//初始化样本,输入初始化为1,输出初始化为0
m_XExamples=newList>();
m_YExamples=newList>();
for(inti=0;i{
Listrow=newList();
for(intj=0;j{
row.Add(1.0);
}
m_XExamples.Add(row);
Listrow1=newList();
for(intj=0;j{
row1.Add(0.0);
}
m_YExamples.Add(row1);
}
returntrue;
}
publicboolGet_XExamValue(intexamIndex,intindex,refdoublea)
{
if(examIndex<1||examIndex>k)
{
returnfalse;
}
if(index<1||index>Ni)
{
returnfalse;
}
a=m_XExamples[examIndex-1][index-1];
returntrue;
}
//设置输入样本值
publicboolSet_XExamValue(intexamIndex,intindex,doubleexamValue)
{
if(examIndex<1||examIndex>k)
{
returnfalse;
}
if(index<1||index>Ni)
{
returnfalse;
}
m_XExamples[examIndex-1][index-1]=examValue;
returntrue;
}
//获得输出样本
publicboolGet_YExamValue(intexamIndex,intindex,refdoublea)
{
if(examIndex<1||examIndex>k)
{
returnfalse;
}
if(index<1||index>No)
{
returnfalse;
}
a=m_YExamples[examIndex-1][index-1];
returntrue;
}
//设置输出样本值
publicboolSet_YExamValue(intexamIndex,intindex,doubleexamValue)
{
if(examIndex<1||examIndex>k)
{
returnfalse;
}
if(index<1||index>No)
{
returnfalse;
}
m_YExamples[examIndex-1][index-1]=examValue;
returntrue;
}
protectedList>m_TXExamples;//输入测试样本
protectedList>m_TYExamples;//输出测试样本
publicboolTXY()
{
//初始化样本,输入初始化为1,输出初始化为0
m_TXExamples=newList>();
m_TYExamples=newList>();
for(inti=0;i{
Listrow=newList();
for(intj=0;j{
row.Add(1.0);
}
m_TXExamples.Add(row);
Listrow1=newList();
for(intj=0;j{
row1.Add(0.0);
}
m_TYExamples.Add(row1);
}
returntrue;
}
publicboolGet_TXExamValue(intexamIndex,intindex,refdoublea)
{
if(examIndex<1||examIndex>Tk)
{
returnfalse;
}
if(index<1||index>Ni)
{
returnfalse;
}
a=m_TXExamples[examIndex-1][index-1];
returntrue;
}
//设置输入样本值
publicboolSet_TXExamValue(intexamIndex,intindex,doubleexamValue)
{
if(examIndex<1||examIndex>k)
{
returnfalse;
}
if(index<1||index>Ni)
{
returnfalse;
}
m_TXExamples[examIndex-1][index-1]=examValue;
returntrue;
}
publicboolInit()
{
inti,j;
Randomrd=newRandom();
for(i=0;i{
for(j=0;j{
W1[i,j]=rd.NextDouble()-0.5;//%12/10.0-1.2;
}
}
for(i=0;i{
for(j=0;j{
W2[i,j]=rd.NextDouble()-0.5;//%12/10.0-1.2;
}
}
for(i=0;ifor(i=0;ireturntrue;
}
doublesigmoid(doublex)
{
return1.0/(1.0+Math.Exp(-a*x));
}
doublesum1(intk,inth,inti)
{
doublet=0;
intj;
switch(h)
{
case1:
for(j=0;j{
t+=W1[j,i]*m_XExamples[k][j];
}
t-=thrH[i];
break;
case2:
for(j=0;j{
t+=W2[j,i]*Ohidden[k,j];
}
t-=thrO[i];
break;
default:
break;
}
returnt;
}
doublesum2(intk,inth,inti)
{
doublet=0;
for(intj=0;j{
t+=W2[i,j]*Ooutput[k,j]*(1.0-Ooutput[k,j])*betaO[k,j];
}
returnt;
}
voidforward(intk)
{
doubleerrorsum=0;
for(inti=0;i{
Ohidden[k,i]=sigmoid(sum1(k,1,i));
}
for(inti=0;i{
Ooutput[k,i]=sigmoid(sum1(k,2,i));
if(m_YExamples[k][i]!
=0)
{
P=Math.Abs((m_YExamples[k][i]-Ooutput[k,i])/m_YExamples[k][i]);
errorsum+=P;
}
else
{
P=Math.Abs(m_YExamples[k][i]-Ooutput[k,i]);
errorsum+=P;
}
}
P=errorsum/No;
}
voidbackward(intk)
{
inti,j;
for(i=0;i{
betaO[k,i]=m_YExamples[k][i]-Ooutput[k,i];
}
for(i=0;i{
betaH[k,i]=sum2(k,1,i);
}
for(i=0;i{
for(j=0;j{
deltaW2[i,j]=r*Ohidden[k,i]*Ooutput[k,j]*(1-Ooutput[k,j])*betaO[k,j];
}
}
for(i=0;i{
deltathrO[i]=-r*Ooutput[k,i]*(1-Ooutput[k,i])*betaO[k,i];
}
for(i=0;i{
for(j=0;j{
deltaW1[i,j]=r*m_XExamples[k][i]*Ohidden[k,j]*(1-Ohidden[k,j])*betaH[k,j];
}
}
for(i=0;i{
deltathrH[i]=-r*Ohidden[k,i]*(1-Ohidden[k,i])*betaH[k,i];;
}
for(i=0;ifor(j=0;j{
W2[i,j]+=deltaW2[i,j];
}
for(i=0;ifor(j=0;j{
W1[i,j]+=deltaW1[i,j];
}
for(i=0;ifor(i=0;i}
publicboolTrain()
{
do
{
jj++;
for(inti=0;i{
forward(i);
backward(i);
}
}
while(P>eps&&jj