📄 rbfnet.~jav
字号:
public class RbfNet extends Object {
int inNum; //输入接点数
int hideNum;//隐含接点数
int outNum; //输出接点数
double c[][];//重心
double d[];//距离(歪)
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 RbfNet(int inNum,int hideNum,int outNum,double p[][]) {
in_rate=1.0;//输入归一化系数
/*
double pmax=0.0;
for (int isamp=0;isamp<p.length;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<p.length;isamp++){
for (int i=0;i<inNum;i++)
p[isamp][i]=p[isamp][i]/in_rate;
}//end for isamp
*/
LBG lbg=new LBG(p,hideNum);
c=lbg.getc();
d=lbg.getd();
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;
for(int i=0;i<inNum;i++)
for(int j=0;j<hideNum;j++)
w[i][j]=1.0;
for(int i=0;i<hideNum;i++)
for(int j=0;j<outNum;j++)
w1[i][j]=1.0;
}
/**********************************/
/*****BP神经控制器算法训练函数*****/
public void train(double p[][],double t[][],int samplenum){
e=0.0;
for(int isamp=0;isamp<samplenum;isamp++)//循环训练一次样本
{
for(int i=0;i<inNum;i++)//构造每个样本的输入和输出标准
//x[i]=p[isamp][i]/in_rate;
x[i]=p[isamp][i];
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]-c[j][i])*(w[i][j]*x[i]-c[j][i]);
x1[j]=Math.exp(-o1[j]/(2*d[j]*d[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]=o2[k];
//System.out.println(String.valueOf(x2[k]));
}
//System.out.println("ok1");
for(int k=0;k<outNum;k++)
{qq[k]=(yd[k]-x2[k])*x2[k];
e+=Math.abs(yd[k]-x2[k])*Math.abs(yd[k]-x2[k]);//计算均方差
//System.out.println(String.valueOf(e));
for(int j=0;j<hideNum;j++)
if (x1[j]>0.05)
w1[j][k]=w1[j][k]+rate_w1*qq[k]*x1[j];
//System.out.println(String.valueOf(x2[0]));
}
}//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;
x[i]=psim[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]-c[j][i])*(w[i][j]*x[i]-c[j][i]);
x1[j]=Math.exp(-o1[j]/(2*d[j]*d[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]=o2[k];
}
return x2;
} //end sim
} //end bp class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -