139 lines
4.7 KiB
Java
139 lines
4.7 KiB
Java
|
|
||
|
|
||
|
import java.util.*;
|
||
|
class k_means
|
||
|
{
|
||
|
static int count1,count2,count3;
|
||
|
static int d[];
|
||
|
static int k[][];
|
||
|
static int tempk[][];
|
||
|
static double m[];
|
||
|
static double diff[];
|
||
|
static int n,p;
|
||
|
static int cal_diff(int a) // This method will determine the cluster in which an element go at a particular step.
|
||
|
{
|
||
|
int temp1=0;
|
||
|
for(int i=0; i<p; ++i)
|
||
|
{
|
||
|
if(a>m[i])
|
||
|
diff[i]=a-m[i];
|
||
|
else
|
||
|
diff[i]=m[i]-a;
|
||
|
}
|
||
|
int val=0;
|
||
|
double temp=diff[0];
|
||
|
for(int i=0; i<p; ++i)
|
||
|
{
|
||
|
if(diff[i]<temp)
|
||
|
{
|
||
|
temp=diff[i];
|
||
|
val=i;
|
||
|
}
|
||
|
}//end of for loop
|
||
|
return val;
|
||
|
}
|
||
|
static void cal_mean() // This method will determine intermediate mean values
|
||
|
{
|
||
|
for(int i=0; i<p; ++i)
|
||
|
m[i]=0; // initializing means to 0
|
||
|
int cnt=0;
|
||
|
for(int i=0; i<p; ++i)
|
||
|
{
|
||
|
cnt=0;
|
||
|
for(int j=0; j<n-1; ++j)
|
||
|
{
|
||
|
if(k[i][j]!=-1)
|
||
|
{
|
||
|
m[i]+=k[i][j];
|
||
|
++cnt;
|
||
|
}
|
||
|
}
|
||
|
m[i]=m[i]/cnt;
|
||
|
}
|
||
|
}
|
||
|
static int check1() // This checks if previous k ie. tempk and current k are same.Used as terminating case.
|
||
|
{
|
||
|
for(int i=0; i<p; ++i)
|
||
|
for(int j=0; j<n; ++j)
|
||
|
if(tempk[i][j]!=k[i][j])
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
public static void main(String args[])
|
||
|
{
|
||
|
Scanner scr=new Scanner(System.in);
|
||
|
/* Accepting number of elements */
|
||
|
System.out.println("Enter the number of elements ");
|
||
|
n=scr.nextInt();
|
||
|
d=new int[n];
|
||
|
/* Accepting elements */
|
||
|
System.out.println("Enter "+n+" elements: ");
|
||
|
for(int i=0; i<n; ++i)
|
||
|
d[i]=scr.nextInt();
|
||
|
/* Accepting num of clusters */
|
||
|
System.out.println("Enter the number of clusters: ");
|
||
|
p=scr.nextInt();
|
||
|
/* Initialising arrays */
|
||
|
k=new int[p][n];
|
||
|
tempk=new int[p][n];
|
||
|
m=new double[p];
|
||
|
diff=new double[p];
|
||
|
/* Initializing m */
|
||
|
for(int i=0; i<p; ++i)
|
||
|
m[i]=d[i];
|
||
|
int temp=0;
|
||
|
int flag=0;
|
||
|
do
|
||
|
{
|
||
|
for(int i=0; i<p; ++i)
|
||
|
for(int j=0; j<n; ++j)
|
||
|
{
|
||
|
k[i][j]=-1;
|
||
|
}
|
||
|
for(int i=0; i<n; ++i) // for loop will cal cal_diff(int) for every element.
|
||
|
{
|
||
|
temp=cal_diff(d[i]);
|
||
|
if(temp==0)
|
||
|
k[temp][count1++]=d[i];
|
||
|
else if(temp==1)
|
||
|
k[temp][count2++]=d[i];
|
||
|
else if(temp==2)
|
||
|
k[temp][count3++]=d[i];
|
||
|
}
|
||
|
cal_mean(); // call to method which will calculate mean at this step.
|
||
|
flag=check1(); // check if terminating condition is satisfied.
|
||
|
if(flag!=1)
|
||
|
/*Take backup of k in tempk so that you can check for equivalence in next step*/
|
||
|
for(int i=0; i<p; ++i)
|
||
|
for(int j=0; j<n; ++j)
|
||
|
tempk[i][j]=k[i][j];
|
||
|
System.out.println("\n\nAt this step");
|
||
|
System.out.println("\nValue of clusters");
|
||
|
for(int i=0; i<p; ++i)
|
||
|
{
|
||
|
System.out.print("K"+(i+1)+"{ ");
|
||
|
for(int j=0; k[i][j]!=-1 && j<n-1; ++j)
|
||
|
System.out.print(k[i][j]+" ");
|
||
|
System.out.println("}");
|
||
|
}//end of for loop
|
||
|
System.out.println("\nValue of m ");
|
||
|
for(int i=0; i<p; ++i)
|
||
|
System.out.print("m"+(i+1)+"="+m[i]+" ");
|
||
|
count1=0;
|
||
|
count2=0;
|
||
|
count3=0;
|
||
|
}
|
||
|
while(flag==0);
|
||
|
System.out.println("\n\n\nThe Final Clusters By Kmeans are as follows: ");
|
||
|
for(int i=0; i<p; ++i)
|
||
|
{
|
||
|
System.out.print("K"+(i+1)+"{ ");
|
||
|
for(int j=0; k[i][j]!=-1 && j<n-1; ++j)
|
||
|
System.out.print(k[i][j]+" ");
|
||
|
System.out.println("}");
|
||
|
}
|
||
|
}
|
||
|
}
|