import java.util.ArrayList; public class KMeans extends VarMin{ public KMeans(int k){ super(k); } @Override public void clustering(){ initCluster(); System.out.println(getCompactness()); boolean change = true; while(change){ change = false; for(int i = 0; i < data.size();i++) { int newCluster = getClosestCluster(data.get(i)); int oldCluster = clusterMap.get(i); if(oldCluster != newCluster){ clusterMap.set(i, newCluster); //update centroids ArrayList p = new ArrayList<>(data.get(i)); ArrayList u1 = new ArrayList<>(centroids.get(oldCluster)); ArrayList u2 = new ArrayList<>(centroids.get(newCluster)); mulPoint(u1, (double)count[oldCluster]); mulPoint(u2, (double)count[newCluster]); addPoint(u2, p); mulPoint(p, -1.0); addPoint(u1, p); mulPoint(u1,(1.0 / (count[oldCluster] - 1))); mulPoint(u2,(1.0 / (count[newCluster] + 1))); centroids.set(oldCluster, u1); centroids.set(newCluster, u2); count[oldCluster]--; count[newCluster]++; //centroids.get(oldCluster) = (1.0 / (count[oldCluster] - 1)) * (count[oldCluster] * centroids.get(oldCluster) - data.get(i)); //centroids.get(newCluster) = (1.0 / (count[newCluster] + 1)) * (count[newCluster] * centroids.get(newCluster) + data.get(i)); //calcCluster(); change = true; } } System.out.println(getCompactness()); } } public static void main(String[] args) { int k = 3; if(args.length >= 1){ k = Integer.parseInt(args[0]); } KMeans kmeans = new KMeans(k); ArrayList> data = DataFileReader.readFile("input.txt"); kmeans.setData(data); kmeans.clustering(); ArrayList>> cluster1 = kmeans.getCluster(); System.out.println("Result:"); printCluster(cluster1); writeToFile(cluster1, "cluster.txt"); } }