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+")";
}
}
--------------------------------------------------------
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