⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kmeans.java

📁 可以导入要聚类的文件
💻 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 + -