java实现kmeans

数据说明:

选用的数据是自己生成的随机的二维的点集,两千行数据,格式为"x,y":

最后的结果是将这些点聚集为了三类,前面是每一个点的类号。

java实现kmeans_第1张图片

思路很简单:

1.初始化

  1.1先把数据集中的点的坐标读入到一个二维数组中

  1.2并选择前面的三个点作为初始的中心点。

2.迭代部分

  2.1 对每个点分别计算到三个中心点的距离,并根据最小的距离给点分类

  2.2 对每一类的所有点的横纵坐标计算均值生成新的中心点保存。

代码:

import java.io.*;

import org.apache.hadoop.conf.Configuration;
public class kmeans1
{
	static double [][] cluster={{1,1},{2,2},{3,3}};
	static double [][] point =new double[2000][2];
	static int []kind=new int[2000];
	static int count=0;
	static int []Count=new int[3];
	public static void readfile() throws IOException
	{
		BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("/usr/local/hadoop/data.txt"),"GBK"));
		
		String str = null;
		while ((str = in.readLine()) != null) {
		     //System.out.println(str);
		        //写入相关文件
		        //out.write(str);
		        //out.newLine();
			  double point_x=Double.valueOf(str.split(",")[0]);
		  	  double point_y=Double.valueOf(str.split(",")[1]);
		  	  point[count][0]=point_x;
		  	  point[count][1]=point_y;
		  	  if(count<3)
		  	  {
		  		  cluster[count][0]=point_x;
		  		  cluster[count][1]=point_y;
		  	  }
		  	  count++;
		    }
		    //清楚缓存
		    //out.flush();
		    //关闭流
		    in.close();
		    //out.close();
	}
	public static void iter()
	{
		for(int i=0;i<20;i++)
		{
			
			for(int j=0;j<2000;j++)
			{
				double distance=1000000000.0;
				for(int k=0;k<3;k++)
				{
					double temp=Math.pow(point[j][0]-cluster[k][0], 2)+Math.pow(point[j][1]-cluster[k][1], 2);
					if(temp

 

你可能感兴趣的:(java,大数据)