Saturday, 1 December 2012

Kmeans algorithm in JAVA

first the Point class
--------------------------------------------------------

package KmeansPractice;

public class Point {

private float X;
private float Y;

public Point()
{
this.X=0;
this.Y=0;
}
public boolean same(Point p1,Point p2)
{
int i1 = Float.compare(p1.getX(),p2.getX());
int i2 = Float.compare(p1.getY(),p2.getY());
if(i1==0 && i2==0)
return true;
else
return false;

}
public Point(float x, float y)
{
System.out.println(x+","+y);
this.X=x;
this.Y=y;
}

public float getX()
{
return X;
}

public float getY()
{
return Y;
}
    public void putX(float x)
    {
    this.X=x;
    }
    public void putY(float y)
    {
    this.Y=y;
    }
   
    public String toString()
    {
      return "("+this.X+","+this.Y+")";
    }
}

---------------------------------------------------------------
Now the cluster class
---------------------------------------------------------------
package KmeansPractice;
import java.util.*;

import KmeansPractice.Point;
public class Cluster {

private ArrayList<Point> cluster;
Point mean;
Cluster()
{
cluster=new ArrayList<Point>();
mean = new Point();
}
public void setMean(Point p)
{
mean=p;
}
public boolean exists(Point p)
{
if(cluster.contains(p))
 return true;
else return false;
}
    public void add(Point p)
    {
    cluster.add(p);
    }
    public void delete(Point p)
    {
    cluster.remove(p);
    }
public Point getMean()
{
return mean;
}
public Point calMean()
{
float X=0,Y=0;
for(Point p:cluster)
{
X = X+p.getX();
Y = Y+p.getY();
}
X=X/cluster.size();
Y=Y/cluster.size();
mean=new Point(X,Y);
return mean;
}
public String toString()
{
String S="";
for(Point p:cluster)
   {
S+=p.toString();
   }
return S;
}
}

-------------------------------------------------------
Now the KMEANS ALGORITHM
--------------------------------------------------------

package KmeansPractice;
import java.util.*;


import KmeansPractice.Point;
import KmeansPractice.Cluster;

public class Kmeans {
ArrayList<Cluster> C = new ArrayList<Cluster>();
ArrayList<Point> P=new ArrayList<Point>();
ArrayList<Point> means=new ArrayList<Point>();
int N;
Kmeans(int N)
{
this.N=N;
}
public void initialize()
{
Random rand=new Random();  
 
  for(int i=0;i<10;i++)
  {
  Point p=new Point((float)(rand.nextInt()%10),(float)(rand.nextInt()%10));
      P.add(p);
      //System.out.println(p.toString());
   } 
  Cluster C1=new Cluster();
  C1.setMean(P.get(0));
        C.add(C1);
  Cluster C2=new Cluster();
  C2.setMean(P.get(1));
  C.add(C2);
  Cluster C3=new Cluster();
  C3.setMean(P.get(2));
  C.add(C3);
}
public boolean AlgoKmeans()
{
System.out.println("entered algokmeans func");
Scanner sc = new Scanner(System.in);
float Mindist,CurrDist;
int index=0;
System.out.println("present clusters:");
means = new ArrayList<Point>();
for(Cluster c:C)
{
System.out.println(c.toString());
means.add(c.getMean());
}
System.out.println("present means:");
for(Cluster c:C)
{
System.out.println(c.getMean());
// means.add(c.getMean());
}
sc.nextInt();
//calculate mean and distance
 for(int i=0;i<10;i++)
 {  Mindist=999;
 for(int j=0;j<N;j++)
   {CurrDist=EDistance(P.get(i),C.get(j).getMean()); 
 
   if(C.get(j).exists(P.get(i)))
    {C.get(j).delete(P.get(i));}
    if(Mindist>CurrDist)
    {
    Mindist=CurrDist;
    index=j;
    }
   }
 C.get(index).add(P.get(i)); 
 
 }
 System.out.println("printing clusters before calculated means");
 for(Cluster c:C)
 {
 System.out.println(c.toString());
 }
 System.out.println("printing calculated means");
 for(int i=0;i<N;i++)
{
C.get(i).calMean();
System.out.println(C.get(i).getMean());
System.out.println("check:"+means.get(i).toString() + C.get(i).getMean().toString());
if(((C.get(i).getMean()).same(means.get(i),C.get(i).getMean())))
{
 
}
else
return false;
}
 System.out.println("printing clusters before calculated means");
 for(Cluster c:C)
 {
 System.out.println(c.toString());
 }
 return true;
}
public void print()
{
System.out.println("entered print func");
for(Cluster c:C)
   {
 System.out.println(c.toString());
   }
}
public float EDistance(Point p1, Point p2)
{  return (float)Math.sqrt((p1.getX()-p2.getX())*(p1.getX()-p2.getX())+(p1.getY()-p2.getY())*(p1.getY()-p2.getY()));
}
public static void main(String args[])
{
/*Point p1 = new Point((float)3.5,(float)4.5);
Point p2 = new Point((float)3.5,(float)4.5);
System.out.println(p1.same(p1,p2));
*/
Kmeans k =new Kmeans(3);
k.initialize();
   while(!k.AlgoKmeans())
  k.AlgoKmeans();
   k.print();
}
}

----------------------------------------------------------------------------------------------------------------------------------End of the code
in case you want package or have any doubts contact at kushiitian@gmail.com

No comments:

Post a Comment