68 lines
2.4 KiB
Java
68 lines
2.4 KiB
Java
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<Double> p = new ArrayList<>(data.get(i));
|
|
ArrayList<Double> u1 = new ArrayList<>(centroids.get(oldCluster));
|
|
ArrayList<Double> 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<ArrayList<Double>> data = DataFileReader.readFile("input.txt");
|
|
kmeans.setData(data);
|
|
|
|
kmeans.clustering();
|
|
ArrayList<ArrayList<ArrayList<Double>>> cluster1 = kmeans.getCluster();
|
|
System.out.println("Result:");
|
|
printCluster(cluster1);
|
|
|
|
writeToFile(cluster1, "cluster.txt");
|
|
}
|
|
}
|