k-means算法的java实现

      k-means是一种最常用的聚类算法。关于k-means算法的介绍到处都能找到,并且比较容易理解。mahout里面也实现了k-means算法。下面贴出的是自己写的实现。目的是帮助大家能更清楚的认识和更快的掌握k-means算法。

   

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;

/**
 * 
 * @author aturbo
 * 1、随机选择k个点作为中心点(centroid)
 * 2、计算点到各个类中心的距离;
 * 3、将点放入最近的中心点所在的类
 * 4、重新计算中心点
 * 5、判断目标函数是否收敛,收敛停止,否则循环2-4步
 * 
 */
public class MyKmeans {

	public static final double[][] points = { { 1, 1 }, { 2, 1 }, { 1, 2 }, { 2, 2 }, { 3, 3 }, { 8, 8 }, { 9, 8 },
			{ 8, 9 }, { 9, 9 } };
	
	/**
	 * 随机选择k个点作为中心点
	 * @param k 
	 * @return k个中心点
	 */
	private static double[][] chooseinitK(int k){
		double[][] cluster = new double[k][];
		Set set = new HashSet();
		for(int i = 0;i iterator = set.iterator();
		int j =0;
		while(iterator.hasNext()){
			cluster[j]=points[iterator.next()];
			j++;
		}
		for(int i = 0;i[] cluster){
		double cost = 0.0;
		for(int i = 0;i[] returnCluster(double[][] points,double[][] centers,int k){
		List[] cluster = new ArrayList[k];
		for(int i = 0;i();
		}
		for(double[] point:points){
			double min_distance = Double.MAX_VALUE;
			int clusterNum = 0;
			int flag =  0;
			double distance =0.0;
			for(double[] center:centers){
				distance = eurDistance(center, point);
				if(distance[] cluster){
		double x = 0.0;
		double y = 0.0;
		int k = cluster.length;
		double[][] initk =new  double[k][2];
		for(int i = 0;i

你可能感兴趣的:(机器学习,数据挖掘)