?? bpnet.~jav
字號:
public class BpNet extends Object {
int inNum; //輸入接點數
int hideNum;//隱含接點數
int outNum; //輸出接點數
int epochs;
double x[]; //輸入向量
double x1[];//隱含接點狀態值
double x2[];//輸出接點狀態值
double o1[];
double o2[];
double w[][];//隱含接點權值
double w1[][];//輸出接點權值
double rate_w; //權值學習率(輸入層-隱含層)
double rate_w1;//權值學習率 (隱含層-輸出層)
double rate_b1;//隱含層閥值學習率
double rate_b2;//輸出層閥值學習率
double b1[];//隱含接點閥值
double b2[];//輸出接點閥值
double pp[];
double qq[];
double yd[];
double e;
double in_rate;//輸入歸一化比例系數
public BpNet(int inNum,int hideNum,int outNum) {
this.epochs=500;
this.inNum=inNum;
this.hideNum=hideNum;
this.outNum=outNum;
x=new double[inNum]; //輸入向量
x1=new double[hideNum];//隱含接點狀態值
x2=new double[outNum];//輸出接點狀態值
o1=new double[hideNum];
o2=new double[outNum];
w=new double[inNum][hideNum];//隱含接點權值
w1=new double[hideNum][outNum];//輸出接點權值
b1=new double[hideNum];//隱含接點閥值
b2=new double[outNum];//輸出接點閥值
pp=new double[hideNum];
qq=new double[outNum];
yd=new double[outNum];
rate_w=0.05;//權值學習率(輸入層-隱含層)
rate_w1=0.05;//權值學習率 (隱含層-輸出層)
rate_b1=0.05;//隱含層閥值學習率
rate_b2=0.05;//輸出層閥值學習率
e=0.0;
in_rate=1.0;//輸入歸一化系數
}
/**********************************/
/*****BP神經控制器算法訓練函數*****/
public void train(double p[][],double t[][],int samplenum){
double etime=100;
e=0.0;
double pmax=0.0;
for (int isamp=0;isamp<samplenum;isamp++){
for (int i=0;i<inNum;i++)
{if (Math.abs(p[isamp][i])>pmax)
pmax=Math.abs(p[isamp][i]);
}
}//end for isamp
in_rate=pmax;
for(int isamp=0;isamp<samplenum;isamp++)//循環訓練一次樣本
{
for(int i=0;i<inNum;i++)
x[i]=p[isamp][i]/in_rate;
for(int i=0;i<outNum;i++)
yd[i]=t[isamp][i];
//構造每個樣本的輸入和輸出標準
for(int j=0;j<hideNum;j++)
{o1[j]=0.0;
for(int i=0;i<inNum;i++)
o1[j]=o1[j]+w[i][j]*x[i];
x1[j]=1.0/(1.+Math.exp(-o1[j]-b1[j]));
}
for(int k=0;k<outNum;k++)
{o2[k]=0.0;
for(int j=0;j<hideNum;j++)
o2[k]=o2[k]+w1[j][k]*x1[j];
//x2[k]=1.0/(1.0+Math.exp(-o2[k]-b2[k]));
x2[k]=o2[k]-b2[k];
}
//System.out.println("ok1");
for(int k=0;k<outNum;k++)
{//qq[k]=(yd[k]-x2[k])*x2[k]*(1.-x2[k]);
qq[k]=(yd[k]-x2[k]);
e+=Math.abs(yd[k]-x2[k])*Math.abs(yd[k]-x2[k]);//計算均方差
for(int j=0;j<hideNum;j++)
w1[j][k]=w1[j][k]+rate_w1*qq[k]*x1[j];
}
for(int j=0;j<hideNum;j++)
{
pp[j]=0.0;
for(int k=0;k<outNum;k++)
pp[j]=pp[j]+qq[k]*w1[j][k];
pp[j]=pp[j]*x1[j]*(1.-x1[j]);
for(int i=0;i<inNum;i++)
w[i][j]=w[i][j]+rate_w*pp[j]*x[i];
}
for(int k=0;k<outNum;k++)
b2[k]=b2[k]+rate_b2*qq[k];
for(int j=0;j<hideNum;j++)
b1[j]=b1[j]+rate_b1*pp[j];
}//end isamp樣本循環
e=Math.sqrt(e);
}//end train
/***************************************/
/*****BP神經控制器算法模擬計算函數*****/
public double[] sim(double psim[]){
for(int i=0;i<inNum;i++)
x[i]=psim[i]/in_rate;
for(int j=0;j<hideNum;j++)
{o1[j]=0.0;
for(int i=0;i<inNum;i++)
o1[j]=o1[j]+w[i][j]*x[i];
x1[j]=1.0/(1.+Math.exp(-o1[j]-b1[j]));
}
for(int k=0;k<outNum;k++)
{o2[k]=0.0;
for(int j=0;j<hideNum;j++)
o2[k]=o2[k]+w1[j][k]*x1[j];
//x2[k]=1.0/(1.0+Math.exp(-o2[k]-b2[k]));
x2[k]=o2[k]-b2[k];
}
return x2;
} //end sim
} //end bp class
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -