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

📄 kmeans.java

📁 使用k-means算法实现聚类分析,将四维的数据分成三个簇.
💻 JAVA
字号:
import java.util.*;
public class KMeans {
	public static void main(String[] args){
		
		K(3,getPointInfom.read());
		
			
		
		
	}
	public static void K(int n,ArrayList<String> arrays){
	double[] x=new double[n];
	double[] y=new double[n];
	double[] z=new double[n];
	double[] w=new double[n];
	double[] xcmp=new double[n];
	double[] ycmp=new double[n];
	double[] zcmp=new double[n];
	double[] wcmp=new double[n];
	int[] count=new int[n];
	int[] cluser=new int[arrays.size()/4];
	double[] xi=new double[arrays.size()/4];
	double[] yi=new double[arrays.size()/4];
	double[] zi=new double[arrays.size()/4];
	double[] wi=new double[arrays.size()/4];
	double[][] xy=new double[xi.length][x.length];
	int i,j;

	for(i=0;i<arrays.size();i++){
		if(i%4==0) xi[i/4]=Double.parseDouble(arrays.get(i));
		else if((i-1)%4==0) yi[(i-1)/4]=Double.parseDouble(arrays.get(i));
		else if((i-2)%4==0) zi[(i-2)/4]=Double.parseDouble(arrays.get(i));
		else if((i-3)%4==0) wi[(i-3)/4]=Double.parseDouble(arrays.get(i));
	}
	//for(i=0;i<xi.length;i++) 
		//System.out.println(xi[i]+" "+yi[i]+" "+zi[i]+" "+wi[i]);;
	for(i=0;i<xi.length&&i<x.length&&i<y.length;i++){
		
		//x[i]=xcmp[i]=xi[i];
		//y[i]=ycmp[i]=yi[i];
		//z[i]=zcmp[i]=zi[i];
		//w[i]=wcmp[i]=wi[i];
		count[i]=0;
	}
	x[0]=xcmp[0]=xi[0];
	y[0]=ycmp[0]=yi[0];
	z[0]=zcmp[0]=zi[0];
	w[0]=wcmp[0]=wi[0];
	
	x[1]=xcmp[1]=xi[50];
	y[1]=ycmp[1]=yi[50];
	z[1]=zcmp[1]=zi[50];
	w[1]=wcmp[1]=wi[50];
	
	x[2]=xcmp[2]=xi[100];
	y[2]=ycmp[2]=yi[100];
	z[2]=zcmp[2]=zi[100];
	w[2]=wcmp[2]=wi[100];
	for(i=0;i<cluser.length;i++) cluser[i]=0;
	
	boolean done;
	done=true;
	int k=0;
	
	while(done){
		for(i=0;i<xi.length;i++){
			for(j=0;j<x.length;j++){
				xy[i][j]=(xi[i]-x[j])*(xi[i]-x[j])+(yi[i]-y[j])*(yi[i]-y[j])+(zi[i]-z[j])*(zi[i]-z[j])+(wi[i]-w[j])*(wi[i]-w[j]);
			}
		}
		
		for(i=0;i<cluser.length;i++) cluser[i]=getMin(xy[i]);
		//for(i=0;i<cluser.length;i++) System.out.print(" "+cluser[i]);
		System.out.println();
		for(i=0;i<cluser.length;i++) 
		{
			if(cluser[i]==0) count[0]+=1;
			else if(cluser[i]==1) count[1]+=1;
			else if(cluser[i]==2) count[2]+=1;
		}
		setZero(x);
		setZero(y);
		setZero(z);
		setZero(w);
		
		for(i=0;i<cluser.length;i++){
			if(cluser[i]==0) 
				{
				x[0]=x[0]+xi[i];
				y[0]=y[0]+yi[i];
				z[0]=z[0]+zi[i];
				w[0]=w[0]+wi[i];
				}
			else if(cluser[i]==1)
			{
				x[1]=x[1]+xi[i];
				y[1]=y[1]+yi[i];
				z[1]=z[1]+zi[i];
				w[1]=w[1]+wi[i];
				}
			else if(cluser[i]==2) 
			{
				x[2]=x[2]+xi[i];
				y[2]=y[2]+yi[i];
				z[2]=z[2]+zi[i];
				w[2]=w[2]+wi[i];
				}
		}
		//计算新的中心点的位置
		for(i=0;i<x.length;i++){
			x[i]=x[i]/count[i];
			y[i]=y[i]/count[i];
			z[i]=z[i]/count[i];
			w[i]=w[i]/count[i];
		}
	    for(i=0;i<count.length;i++)  count[i]=0;
		if(Arrays.equals(x,xcmp)&&Arrays.equals(y,ycmp)&&Arrays.equals(z,zcmp)&&Arrays.equals(w,wcmp))
		{
			done=false;
		}
		else{
			for(i=0;i<x.length;i++){
				xcmp[i]=x[i];
				ycmp[i]=y[i];
				zcmp[i]=z[i];
				wcmp[i]=w[i];
			}
		}
		k++;
		
	}
	
	System.out.println("经过"+k+"次迭代后得到最终聚类的三个簇为:");
	System.out.print("簇1为:");
	for(i=0;i<cluser.length;i++)
	{
		if(cluser[i]==0)  System.out.print(" "+"点"+(i+1));
	}
	System.out.println();
	System.out.print("簇2为:");
	for(i=0;i<cluser.length;i++)
	{
		if(cluser[i]==1)  System.out.print(" "+"点"+(i+1));
	}
	System.out.println();
	System.out.print("簇3为:");
	for(i=0;i<cluser.length;i++)
	{
		if(cluser[i]==2)  System.out.print(" "+"点"+(i+1));
	}
	System.out.println();
	for(i=0;i<x.length;i++){
		System.out.println("("+x[i]+","+y[i]+","+z[i]+","+w[i]+")");
	}
	
	}
	
	//返回数组最小值的下标
	public static int getMin(double[] a){
		int itm=0;
		double min=a[0];
		for(int i=0;i<a.length;i++){
			if(a[i]<min) 
			{
				min=a[i];
				itm=i;
				}
		}
		return itm;
	}
	//数组置零
	public static void setZero(double[] a){
		for(int i=0;i<a.length;i++){
			a[i]=0;
		}
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -