📄 lbg.~jav
字号:
public class LBG extends Object {
double c[][];//重心
int indexc[];
int indext[];
double d[];//距离(歪)
public LBG(double t[][],int N) {
double e=0.001;
double td0=0;//上次总歪
double td;//本次总歪
double d0=999999.9;
double s,s1;
boolean notend=true;
c=new double[N][t[0].length];//重心数组
indexc=new int[N];//重心索引
indext=new int[t.length];//确定样本t的分类
d=new double[N];//类组的歪
for (int i=0;i<N;i++)
{
indexc[i]=i; //确定初始重心为样本1-N
for(int j=0;j<t[0].length;j++)
c[i][j]=t[indexc[i]][j];
}
while (notend){
//决定势力圈
for (int i=0;i<t.length;i++)//遍历数据
{ d0=9999999.9;
for (int j=0;j<N;j++)//遍历类
{s=0.0;
for (int k=0;k<t[0].length;k++)
s+=(t[i][k]-c[j][k])*(t[i][k]-c[j][k]);
s=Math.sqrt(s);
if (s<d0){
d0=s;
indext[i]=j;}
} //end for j
}//end for i
//决定新的重心
for (int i=0;i<N;i++)
{d[i]=999999.0;
s=0;
for (int j=0;j<t.length;j++)
if (indext[j]==i)
{d0=0.0;
for (int k=0;k<t.length;k++)
{if ((indext[k]==i)&&(j!=k))
//if (indext[k]==i)
{ s=0;
for (int l=0;l<t[0].length;l++)
s+=(t[j][l]-t[k][l])*(t[j][l]-t[k][l]);
s=Math.sqrt(s);
}
}//end for k
d0+=s;
if (d0==0.0)
d0=0.1;
//if ((d0<d[i])&&(d0!=0.0)){
if (d0<d[i]){
d[i]=d0;
indexc[i]=j;
for(int m=0;m<t[0].length;m++)
c[i][m]=t[indexc[i]][m];
}
}//end for j
}//end i
//计算总歪
td=0;
for (int i=0;i<N;i++)
td+=d[i];
if (Math.abs(td-td0)<e)
notend=false;
else
td0=td;
}//end while
}//end LBG
public double[][] getc(){
return this.c;
}
public double[] getd(){
return this.d;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -