Problem Definition: Write a program to implement K-means Clustering algorithm
Solution:
import java.io.*; import java.util.*; class Kmeans{ public static void main(String args[])throws IOException{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter the number of values to be evaluated(n):"); int n=Integer.parseInt(br.readLine()); int a[]=new int[n]; System.out.println("Enter values in the same line:"); String s[]=br.readLine().split(" "); for(int i=0;i<n;i++) a[i]=Integer.parseInt(s[i]); System.out.println("Enter the number of clusters(k):"); ArrayList<ArrayList<Integer>> clusters=new ArrayList<ArrayList<Integer>>(); int k=Integer.parseInt(br.readLine()); float mean[][]=new float[k][2]; for(int i=0;i<k;i++) mean[i][0]=a[i]; //it can be randomized as well int size,count=0,index=0; float temp,temp1=0,min=1000; do{ clusters=new ArrayList<ArrayList<Integer>>(); for(int i=0;i<k;i++) clusters.add(new ArrayList<Integer>()); for(int i=0;i<n;i++,min=1000){ for(int j=0;j<k;j++){ temp=Math.abs(a[i]-mean[j][0]); if(temp<min){ index=j; min=temp; } } clusters.get(index).add(a[i]); } for(int i=0;i<k;i++,temp1=0){ size=clusters.get(i).size(); for(int j=0;j<size;j++) temp1+=clusters.get(i).get(j); mean[i][1]=temp1/size; } System.out.println(clusters); count=0; for(int i=0;i<k;i++){ if(mean[i][0]==mean[i][1]) count++; mean[i][0]=mean[i][1]; } }while(count!=k); } }
Output: