一个用java实现的模拟数据挖掘算法k-means的demo。因为老湿说期末如果能自己编写程序模拟课本中的任意算法,通过答辩就可以不用考试。对于我这种不规矩的学生,能不考试当然选择不考了。
进入正题:k-means聚类算法,简单点说就是给定N个坐标点,然后在其中选择k个点做为k个簇的初始中心点,然后计算所有点到各个簇的中心点的距离,将点分配到最近的簇,然后重新计算k个簇的新中心点,然后继续迭代,直到k个簇的中心点不再变化。
先来说下数据结构:
首先定义一个类用于表示坐标点,并且定义和点相关的方法:
//定义一个类用于表示每个坐标点
class Point{
String name;
double x,y;
public Point(String name,double x,double y){
this.name=name;
this.x=x;
this.y=y;
}
public Point(){
}
//计算两个坐标点之间的距离
public static double distance(Point a,Point b){
return Math.sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
//计算每个坐标点距离哪个簇最近
public static int ClusterDistance(Point p,ArrayList<Cluster> array){
int a=0;
for(int i=0;i<array.size();i++){
if(Point.distance(p,array.get(a).center)>Point.distance(p, array.get(i).center)){
a=i;
}
}
return a;
}
//将double数组中的所有坐标点存入Point数组中
public static void PointAdd(ArrayList<Point> PointArray, ArrayList<double[]> DoubleArray){
for(int i=0;i<DoubleArray.size();i++){
PointArray.add(new Point("p"+(i+1),DoubleArray.get(i)[0],DoubleArray.get(i)[1]));
}
}
}
定义一个类用于表示簇以及相关的方法:
//定义一个类用于表示簇
class Cluster{
public Cluster(double x,double y){
center.x=x;
center.y=y;
}
//计算簇的新中心点坐标
public static void NewCenter(Cluster cluster){
double sumx=0,sumy=0;
int i=0;