?? k_means源碼.txt
字號:
import java.io.*;
public class K_Means {
int Flags=0;
int[] logo=new int[150]; //標志位
double center_A[]=new double[4],
center_B[]=new double[4],
center_C[]=new double[4],
center_1[]=new double[4],
center_2[]=new double[4],
center_3[]=new double[4];
double train[][]=new double[150][4]; //將對象實體化
/***************************************************
*讀文件data0.txt中數據,保存至train[][]二維數組中
***************************************************/
public void readtxt()throws Exception
{
BufferedReader br=new BufferedReader(new FileReader("data0.txt"));
String s;
int i,j;
i=0;j=0;
while (br.ready())
{
s=br.readLine();//讀文件中一行
java.util.StringTokenizer tokenizer =
new java.util.StringTokenizer(s, ",,");
while (tokenizer.hasMoreTokens())
{
train[i][j]=Double.parseDouble(tokenizer.nextToken());//將讀入的字符串轉化為雙精度型數據
j++;
if(j==4){j=0;i++; };
};
};
}
/***************************************************
*初始化中心點
***************************************************/
public void initial()
{
for(int i=0;i<3;i++)//初始化簇(舊)中心,不妨以前三個為中心
for(int j=0;j<4;j++)
{
if(i==0){center_A[j]=train[i][j];}
else
if(i==1)
{center_B[j]=train[i][j];}
else {center_C[j]=train[i][j];}
};
for(int j=0;j<4;j++)//初始化簇(新)中心
{
center_1[j]=center_2[j]=center_3[j]=0;
};
for(int i=0;i<train.length;i++)
{
logo[i]=0;//初始化標志位
};
}
/***************************************************
*比較差值,確定所屬類
***************************************************/
public void plus()
{
for(int i=0;i<train.length;i++)
{
double a,b,c;
a=b=c=0;
for(int j=0;j<4;j++)
{
a+=Math.pow((train[i][j]-center_A[j]),2);
b+=Math.pow((train[i][j]-center_B[j]),2);
c+=Math.pow((train[i][j]-center_C[j]),2);
};
token(a,b,c,i);//標記logo[i] ,以logo=1,2,3表示所屬類
};
}
/***************************************************
*更改標志位
***************************************************/
public void token(double a,double b,double c,int i)
{
double temp=0;
if(a>=b)
{
temp=b;
this.logo[i]=2;
}
else
{
temp=a;
this.logo[i]=1;
}
if(temp>=c)
{
temp=c;
this.logo[i]=3;
};
}
/***************************************************
*每聚類一次,求一次新的中心點
***************************************************/
public void center()
{
int num1,num2,num3;
num1=num2=num3=0;
for(int j=0;j<4;j++)
{
center_1[j]=center_2[j]=center_3[j]=0;
};
for(int i=0;i<train.length;i++)
{
switch(logo[i])
{
case 1:
{
for(int j=0;j<4;j++){center_1[j]+=train[i][j];}
num1++;
break;
}
case 2:
{
for(int j=0;j<4;j++){center_2[j]+=train[i][j];}
num2++;
break;
}
case 3:
{
for(int j=0;j<4;j++){center_3[j]+=train[i][j];}
num3++;
break;
}
};
};
for(int j=0;j<4;j++)
{
center_1[j]=(double)(center_1[j]/(double)num1);
center_2[j]=(double)(center_2[j]/(double)num2);
center_3[j]=(double)(center_3[j]/(double)num3);
};
}
/***************************************************
*判斷聚類運算是否結束
***************************************************/
public void compare()
{
double a,b,c; a=b=c=0;
for(int j=0;j<4;j++)
{
a+=Math.pow((center_1[j]-center_A[j]), 2);
b+=Math.pow((center_2[j]-center_B[j]),2);
c+=Math.pow((center_3[j]-center_C[j]),2);
};
if((a<0.01)&&(b<0.01)&&(c<0.01))
{
Flags=1;
};
}
/***************************************************
*用新的簇中心替換舊的簇中心
***************************************************/
public void DuplicateCenter()
{
for(int j=0;j<4;j++)
{
center_A[j]=center_1[j];
center_B[j]=center_2[j];
center_C[j]=center_3[j];
};
}
/***************************************************
*寫文件到cluster_result.txt中
***************************************************/
public void WrietTxt()throws Exception
{
BufferedWriter bw=new BufferedWriter(new FileWriter("cluster_result.txt"));
int i=0;
while(i<train.length)
{
String s="";
for(int j=0;j<4;j++)
{
s+=" "+String.valueOf(train[i][j])+" ";//獲得train[][]每一行數據,轉化為字符串類型
};
bw.write(s+String.valueOf(logo[i]));//加入標志位
bw.newLine();
i++;
};
bw.close();
}
public static void main(String args[])throws Exception
{
K_Means app=new K_Means();//創建一個類實例
app.readtxt();
app.initial();
app.plus();
app.center();
while(app.Flags==0)
{
app.DuplicateCenter();
app.plus();
app.center();
app.compare();
};
app.WrietTxt();
for(int i=0;i<app.train.length;i++)//顯示結果-測試用
{
System.out.println(i+"----"+ app.logo[i]);
};
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -