算法说明:
(每次运行都会生成新的样本点,若想要固定的样本点,可在第二次运行时不执行createData方法)
1、使用方法:在Run类的main方法里面新建KMeans对象,并依次调用createData、getData、sort方法
2、首先会随机生成训练样本,写入文件data.txt,并读取保存在data数组里面
3、用随机数随机选出K个初始的中心点
4、计算所有点到K个中心点的距离,选出距离最近的那个点,将其归属于该中心点的一类,完成后会将样本点分成K类
5、计算每一类样本点的平均值,平均值为每一类新的中心点
6、重复4、5步骤,直到收敛(到达迭代次数或两次迭代得到的中心点一致)
实现部分
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
public class KMeans {
double[][] data = new double[500][2];//从文件中读取的数据集
private int K;//分成几类?
private int iterateTime;//迭代次数
boolean isSameAsLastTime;//阈值,当两次找到的中心点一致时,停止迭代
public KMeans(int k,int iterateTime) {
K = k;
this.iterateTime = iterateTime;
}
//开始分类
public void sort() {
double[][] center = new double[K][2];//中心点
double[] distance = new double[K];//该点到N个中心点的距离
//N个装着数组的列表
ArrayList<ArrayList<double[]>> sortData = new ArrayList<>();
//获取初始中心点
for(int i=0;i<K;i++){
center[i][0]=data[new Random().nextInt(100)][0];
center[i][1]=data[new Random().nextInt(100)][1];
sortData.add(new ArrayList<double[]>());
System.out.println("初始"+i+"中心点:"