我有一个数据集,每个实例都只有一个属性值,我需要对其进行聚类。我认为Java-ML(Java机器学习库)适合这个任务。但我发现其中的”Dataset”类被设计为一个实例集,而每个实例又是一个属性集和一个类标签。我的问题是每个实例只有一个属性,并且没有类标签。
以下是我尝试过的示例代码,但令人意外的是,一旦开始聚类,执行就不会结束。
int k; Dataset dataset = new DefaultDataset(); double[] val= {5,6,15,20,40,50,55,73}; for(int i = 0; i < val.length; i++) { Instance instance= new SparseInstance(1); instance.put(1, val[i]); dataset.add(instance); } k = 3; Clusterer km = new KMeans(k); System.out.println(dataset); Dataset[] clusters = km.cluster(dataset); System.out.println(dataset); for(int i = 0; i < k; i++) { System.out.println(clusters[i]+"\n\n\n\n"); }
我无法理解这种意外行为背后的原因。是否有其他库比Java-ML更适合我的工作?
提前感谢。
回答:
首先,由于你的数据是一维的,首先不要使用聚类。
一维数据可以进行排序,这允许使用比一般情况更快的算法。你可能需要研究经典统计学、自然断点、核密度估计等。实际上,我会从核密度估计开始,并在两个局部最大值之间的最低最小值处分割数据。
关于Java-ML,你所说的表明它实际上是一个分类包。需要类标签是针对以分类为目的的应用的典型要求。在这种情况下,拥有类标签对于学习和验证至关重要。
我主要使用ELKI,它提供了大量的聚类算法选择,并且不期望数据被标记。