📄 kmeans.java
字号:
import java.io.*;
public class KMeans
{
double[][] sample;//所有样本数据
double[][] center;//每种类中心点的XY值
int clusterkind,totaln;//聚类种类数及样本总数
public KMeans(int total,int clusterkd)
{
this.totaln=total;
this.clusterkind=clusterkd;
center=new double[clusterkind][2];
sample=new double[totaln][3];
}
void Calssify()//根据欧几里德距离,将所有点划分到各个类中
{
int i,j;
double dis,district;
i=0;
while(i<totaln)
{
district=10000;
for(j=0;j<clusterkind;j++)
{
dis=Math.sqrt((sample[i][0]-center[j][0])*(sample[i][0]-center[j][0])+(sample[i][1]-center[j][1])*(sample[i][1]-center[j][1]));
if(dis<district)
{
sample[i][2]=j;
district=dis;
}
}
i++;
}
}
boolean WetherAlter(double[][] center1,double[][]center2,int clusterkind)//判断依次计算的各个类均值是否有改变
{
int cout=0;
while(cout<clusterkind)
{
if(center1[cout][0]!=center2[cout][0] || center1[cout][1]!=center2[cout][1])
return false;
cout++;
}
return true;
}
boolean IsUpdataCenter()//判断类中心值是否改变,改变的相应更改类中心点的值
{
int i,j;
int[] kind=new int[clusterkind];
double[]amoutx=new double[clusterkind];
double[]amouty=new double[clusterkind];
double[][]amoutxy =new double[clusterkind][2];
for(i=0;i<totaln;i++)
{
amoutx[(int)sample[i][2]]+=sample[i][0];
amouty[(int)sample[i][2]]+=sample[i][1];
kind[(int)sample[i][2]]++;
}
for(j=0;j<clusterkind;j++)
{
amoutx[j]/=(double)kind[j];
amouty[j]/=(double)kind[j];
amoutxy[j][0]=amoutx[j];
amoutxy[j][1]=amouty[j];
}
if(!WetherAlter(amoutxy,center,clusterkind))
{
for(i=0;i<clusterkind;i++)
{
center[i][0]=amoutxy[i][0];
center[i][1]=amoutxy[i][1];
}
return false;
}
else
return true;
}
void PrintSave()throws java.io.IOException//输出聚类结果到屏幕上,并保存到Result.txt文件中
{
PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter("Result.txt")));
for(int i=0;i<totaln;i++)
{
System.out.println("sample:"+(i+1)+" "+sample[i][0]+" "+sample[i][1]+" "+"Class:"+((int)sample[i][2]+1)+"\n");
out.println("sample:"+(i+1)+" "+sample[i][0]+" "+sample[i][1]+" "+"Class:"+((int)sample[i][2]+1)+"\n");
}
}
void Cluster()throws java.io.IOException
{
int change=1;
while(change==1)
{
Calssify();
if(IsUpdataCenter())
{
PrintSave();
change=0;
}
}
}
public static void main(String[] args)throws java.io.IOException
{
String sourcefile;
System.out.print("Input the sourcefile's path:");
BufferedReader tempread = new BufferedReader(new InputStreamReader(System.in));
sourcefile = tempread.readLine();
int clusterkind;
System.out.print("Input the number of kind to cluster :");
clusterkind=Integer.parseInt(tempread.readLine());
InputStream inputstr=new FileInputStream(sourcefile);
BufferedReader readline=new BufferedReader(new InputStreamReader(inputstr));
String everyline;
KMeans kmeans=new KMeans(100000,clusterkind);
int cout=0;
while(cout<kmeans.totaln)
{
everyline=readline.readLine();
if(everyline==null)
break;
String[] line=everyline.split(" ");
kmeans.sample[cout][0]=Double.parseDouble(line[0]);
kmeans.sample[cout][1]=Double.parseDouble(line[1]);
kmeans.sample[cout][2]=-1;
if(cout<kmeans.clusterkind)
{
kmeans.center[cout][0]=Double.parseDouble(line[0]);
kmeans.center[cout][1]=Double.parseDouble(line[1]);
}
cout++;
}
kmeans.Cluster();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -