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

📄 k_means.java

📁 一个用java实现的k-means的简单算法
💻 JAVA
字号:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Vector;

public class K_means {
	static int count = 0;
	ArrayList<Data> d;
	int[] label;
	Data center ;
	int k =0;
	int num = 3;
	Cluster[] cluster = new Cluster[num] ;
	Data [] center1 = new Data[num];
	
	

	public static void main(String[] args) {

		K_means km = new K_means();
		String fname = "iris.txt";
		File dataFile = new File(fname);
		if (!dataFile.exists()) {
			System.err.println("未找到名为examle.txt的文件");
			System.exit(-1);
		}
		km.readFile(fname);
		//System.out.print(count);
		
		km.init();
		
		while(km.k<km.num) {
		km.start();
		}
	}

	public void init() {
		for(int i=0;i<num;i++) {
			cluster[i]= new Cluster();
		}
		
		for(int i=0;i<num;i++) {
			center1[i] = d.get(i);
		}
	}

	public void readFile(String s) {

		Vector<String> dv = new Vector<String>();

		try { 
			BufferedReader in = new BufferedReader(new FileReader(s));
			String eachline;
			String[] stringtemp = null;
			while ((eachline = in.readLine()) != null) {
				dv.addElement(eachline);
				count++;
			}
			in.close();
			d = new ArrayList<Data>();
			
			for (int i = 0; i < dv.size(); i++) {
				stringtemp = dv.get(i).split(",");
				/*d.set(i, new Data()) ;
				d.set(i,new Data(Double.parseDouble(stringtemp[0]), Double
						.parseDouble(stringtemp[1]), Double
						.parseDouble(stringtemp[2]), Double
						.parseDouble(stringtemp[3])));*/
				/*Data d1 = new Data();
				d.add(d1);*/
				Data d2 = new Data(Double.parseDouble(stringtemp[0]), Double
						.parseDouble(stringtemp[1]), Double
						.parseDouble(stringtemp[2]), Double
						.parseDouble(stringtemp[3]));
				d.add(d2);
				//System.out.print(d.get(i).data[0]);
			}

		} catch (IOException e) {
			System.out.println(e.getMessage());
			System.exit(1);
		}
	}

	
	public void start() {
		//Cluster cluster = new Cluster(d,count,num,center);
		
		
		
		double [] dis = new double[num];
		label = new int [count];
		for(int i=0; i<d.size();i++) {
			double min = 100.0;
			for(int j=0; j<num;j++) {
				dis[j] = this.squareDistance(center1[j], d.get(i));
				System.out.print("第"+(i+1)+"个数据到第" + (j+1) + "个簇中心的距离为:"+ dis[j] + "\n");
				
				
				if(min >= dis[j]) {
					min = dis[j];
					label[i] = j;
					
					
				}else{}
			}
			cluster[label[i]].member.add(d.get(i));
			//System.out.print(label[i]+"--"+d.get(i).data[0]+"\n");
			System.out.print("将第"+(i+1)+"个数据放入到第" +(label[i]+1)+"个簇中\n");
		}
		k=0;
		for(int j=0;j<num;j++) {
			if(!cluster[j].judgeCenter(center1[j],cluster[j].setCenter(cluster[j].member))) {
			center1[j] = cluster[j].setCenter(cluster[j].member);
				/*for(int i=0;i<4;i++) {
					center1[j].data[i] = cluster[j].setCenter(cluster[j].member).data[i];
				}*/
			//System.out.println(center1[0].data[0]);
			cluster[j].clear();
			//k++;
		}else
			k++;
		}
		
		for(int i=0;i<count;i++){
			System.out.print("第"+(i+1)+"数据的聚类号为"+(label[i]+1)+"\n");
		}
		
		
		
		/*double d2 = d[0].data[0];
		System.out.print(d2);
		center1 = this.setCenter(d);
		for(int i=0;i<4;i++) {
		System.out.print(center1.data[i]);
		}*/
		

}


	
	public double squareDistance(Data d1, Data d2) {
		double distance = 0.0;
		//for (int i = 0; i < count; i++) {
			for (int j = 0; j < 4; j++) {
				double x = d1.data[j];
				double y = d2.data[j];
				distance += Math.pow((x - y), 2);
			}
		//}
		return distance;
	}

	

}

⌨️ 快捷键说明

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