📄 k_means.java
字号:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Vector;
public class K_means {
static int count = 0;
ArrayList<Data> d;
int[] label;
Data center ;
int k =0;
int num = 3;
Cluster[] cluster = new Cluster[num] ;
Data [] center1 = new Data[num];
public static void main(String[] args) {
K_means km = new K_means();
String fname = "iris.txt";
File dataFile = new File(fname);
if (!dataFile.exists()) {
System.err.println("未找到名为examle.txt的文件");
System.exit(-1);
}
km.readFile(fname);
//System.out.print(count);
km.init();
while(km.k<km.num) {
km.start();
}
}
public void init() {
for(int i=0;i<num;i++) {
cluster[i]= new Cluster();
}
for(int i=0;i<num;i++) {
center1[i] = d.get(i);
}
}
public void readFile(String s) {
Vector<String> dv = new Vector<String>();
try {
BufferedReader in = new BufferedReader(new FileReader(s));
String eachline;
String[] stringtemp = null;
while ((eachline = in.readLine()) != null) {
dv.addElement(eachline);
count++;
}
in.close();
d = new ArrayList<Data>();
for (int i = 0; i < dv.size(); i++) {
stringtemp = dv.get(i).split(",");
/*d.set(i, new Data()) ;
d.set(i,new Data(Double.parseDouble(stringtemp[0]), Double
.parseDouble(stringtemp[1]), Double
.parseDouble(stringtemp[2]), Double
.parseDouble(stringtemp[3])));*/
/*Data d1 = new Data();
d.add(d1);*/
Data d2 = new Data(Double.parseDouble(stringtemp[0]), Double
.parseDouble(stringtemp[1]), Double
.parseDouble(stringtemp[2]), Double
.parseDouble(stringtemp[3]));
d.add(d2);
//System.out.print(d.get(i).data[0]);
}
} catch (IOException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
public void start() {
//Cluster cluster = new Cluster(d,count,num,center);
double [] dis = new double[num];
label = new int [count];
for(int i=0; i<d.size();i++) {
double min = 100.0;
for(int j=0; j<num;j++) {
dis[j] = this.squareDistance(center1[j], d.get(i));
System.out.print("第"+(i+1)+"个数据到第" + (j+1) + "个簇中心的距离为:"+ dis[j] + "\n");
if(min >= dis[j]) {
min = dis[j];
label[i] = j;
}else{}
}
cluster[label[i]].member.add(d.get(i));
//System.out.print(label[i]+"--"+d.get(i).data[0]+"\n");
System.out.print("将第"+(i+1)+"个数据放入到第" +(label[i]+1)+"个簇中\n");
}
k=0;
for(int j=0;j<num;j++) {
if(!cluster[j].judgeCenter(center1[j],cluster[j].setCenter(cluster[j].member))) {
center1[j] = cluster[j].setCenter(cluster[j].member);
/*for(int i=0;i<4;i++) {
center1[j].data[i] = cluster[j].setCenter(cluster[j].member).data[i];
}*/
//System.out.println(center1[0].data[0]);
cluster[j].clear();
//k++;
}else
k++;
}
for(int i=0;i<count;i++){
System.out.print("第"+(i+1)+"数据的聚类号为"+(label[i]+1)+"\n");
}
/*double d2 = d[0].data[0];
System.out.print(d2);
center1 = this.setCenter(d);
for(int i=0;i<4;i++) {
System.out.print(center1.data[i]);
}*/
}
public double squareDistance(Data d1, Data d2) {
double distance = 0.0;
//for (int i = 0; i < count; i++) {
for (int j = 0; j < 4; j++) {
double x = d1.data[j];
double y = d2.data[j];
distance += Math.pow((x - y), 2);
}
//}
return distance;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -