我目前正在尝试将大量数据点聚类到指定数量的簇中,并想尝试使用MOA基于流的k-means聚类方法StreamKM
。使用随机数据进行的一个非常简单的示例如下所示:
StreamKM streamKM = new StreamKM();streamKM.numClustersOption.setValue(5); // 默认设置streamKM.widthOption.setValue(100000); // 默认设置streamKM.prepareForUse();for (int i = 0; i < 150000; i++) { streamKM.trainOnInstanceImpl(randomInstance(2));}Clustering result = streamKM.getClusteringResult();System.out.println("size = " + result.size());System.out.println("dimension = " + result.dimension());
随机实例的创建方式如下:
static DenseInstance randomInstance(int size) { DenseInstance instance = new DenseInstance(size); for (int idx = 0; idx < size; idx++) { instance.setValue(idx, Math.random()); } return instance;}
然而,运行给定的代码时,似乎没有创建任何簇:
System.out.println("size = " + result.size()); // size = 0System.out.println("dimension = " + result.dimension()); // NPE
是否还有其他需要注意的地方,或者我对MOA聚类概念有根本性的误解?
回答:
我认为prepareForUse()
方法并不是初始化算法的正确方法。
你应该使用streamKM.resetLearning();
来代替streamKM.prepareForUse();
。
简而言之,你的代码应该如下所示:
StreamKM streamKM = new StreamKM();streamKM.numClustersOption.setValue(5); // 默认设置streamKM.widthOption.setValue(100000); // 默认设置streamKM.resetLearning(); // 更新后的代码行 !!!for (int i = 0; i < 150000; i++) { streamKM.trainOnInstanceImpl(randomInstance(2));}Clustering result = streamKM.getClusteringResult();System.out.println("size = " + result.size());System.out.println("dimension = " + result.dimension());