与分类、序列标注等任务不同,聚类是在事先并不知道任何样本标签的情况下,通过数据之间的内在关系把样本划分为若干类别,使得同类别样本之间的相似度高,不同类别之间的样本相似度低(即增大类内聚,减少类间距)。
聚类属于非监督学习,K均值聚类是最基础常用的聚类算法。它的基本思想是,通过迭代寻找K个簇(Cluster)的一种划分方案,使得聚类结果对应的损失函数最小。
通俗来说,聚类就是把一些点(以二维坐标系为例)选取适当的中心将这些点进行分类。
那么我们如何使用Java来实现该算法的实现,这里以一些随机生成的二维坐标轴点为例。
首先,我们在IDEA下新建软件包,KMeansTest,然后新建类KMeans和类KMeansMethod以及文本文件result用于存放生成的点以及对应的聚簇中心点。
在KMeans类中编写程序的主函数和主运行逻辑,KMeansMethod中具体实现主函数中需要用的方法。
首先,我们需要获取对应的随机生成的点集
编写生成点集的函数前,我们需要编写代码用于生成随机点,这里我们为了方便,将每个点的x与y值设置为不大于100的正整数。
生成随机点的函数getInts()代码如下
// 生成随机点
private static int[] getInts(){
int[] ints = new int[2];
Random random = new Random();
ints[0] = random.nextInt(100);
ints[1] = random.nextInt(100);
return ints;
}
生成随机点集的函数getPoints(int n)的代码如下,n为生成点的数量
// 获取点的集合
public static int[][] getPoints(int n) {
int[][] points = new int[n][];
for (int i = 0; i < n; i++) {
points[i] = getInts();
}
return points;
}
至