K-中心点聚类算法
(1)任意选择k个对象作为初始的簇中心点
(2)指派每个剩余对象给离他最近的中心点所表示的簇
(3)选择一个未被选择的中心点直到所有的中心点都被选择过
(4)选择一个未被选择过的非中心点对象,计算用代替的总代价并记录在S中
,直到所有非中心点都被选择过。
(5)如果在S中的所有非中心点代替所有中心点后的计算出总代价有小于0的存在,然后找出S中的用非中心点替代中心点后代价最小的一个,并用该非中心点替代对应的中心点,形成一个新的k个中心点的集合
(6)重复步骤2-5,直到没有再发生簇的重新分配,即所有的S都大于0.
代码
public class Cluster {
private int id;// 标识
private Point center;// 中心
private List<Point> members = new ArrayList<Point>();// 成员
public Cluster(int id, Point center) {
this.id = id;
this.center = center;
}
public Cluster(int id, Point center, List<Point> members) {
this.id = id;
this.center = center;
this.members = members;
}
public void addPoint(Point newPoint) {
if (!members.contains(newPoint)){
members.add(newPoint);
}else{
System.out.println("样本数据点 {"+newPoint.toString()+"} 已经存在!");
}
}
public float getdis() {
float cur=0;
for (Point point : members) {
cur+=point.getDist()*point.getDist();
}
return cur;
}
public int getId() {
return id;
}
public Point getCenter() {
return center;
}
public void setCenter(Point center) {
this.center = center;
}
public List<Point> getMembers() {
return members;
}
@Override
public String toString() {
String toString = "-----------Cluster"+this.getId()+"---------\n";
toString+="Mid_Point: "+center+" Points_num: "+members.size();
for (Point point : members) {
toString+="\n"+point.toString();
}
return toString+"\n";
}
}
public class datahandler {
public static List<float[]> readTxt(String fileName){
List<float[]> list=new ArrayList<>();
try {
File filename = new File(fileName); // 读取input.txt文件
InputStreamReader reader = new InputStreamReader(
new FileInputStream(filename)); // 建立一个输入流对象reader
BufferedReader br = new BufferedReader(reader);
String line = "";
line = br.readLine();
while (true) {
line = br.readLine();
if(line==null) break;
String[] temp=line.split(",");
float[] c