K-means是无监督学习,也就是说事先并不知道有几类,所有数据都是无标记的,所以虽然本实验的红酒数据集认为应该分为3类,但是对于k-means来说是没有意义的。每次分类前我们首先要人为指定分成K类,然后任意选取K个点作为K个类的中心点,遍历全集,离哪个中心近就认为是哪一堆的。接下来我们要验证所选中心点是否是真正的中心点,计算每一堆各个特征的平均值后得出的就是这一个类的中心,如果与我们认为的中心不同则需要继续计算。以刚才计算出的新中心重新全集遍历分类然后重复上面判断是否完成的过程。最终运算结束,输出真正的中心点。
1.封装的红酒类:
public class Wine {
private double[] data;
public double[] getData() {
return data;
}
public void setData(double[] data) {
this.data = data;
}
}
2.test类:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
public class Test {
private Wine[] wineCenter;//确定为聚集中心的点
private List<Wine>[] wineKind;//分类后的点数组
private int k;
priva