我尝试使用ELKI的XMeans算法对图像数据(存储在100个单独的csv文件中)进行聚类。它适用于前两个文件,但是在处理第三个文件时,算法会永远挂起。看起来问题发生在每个第3个文件左右,因为当我开始循环时,它遍历第四个文件的所有文件,它适用于第四个和第五个文件,但不适用于第六个文件。同样适用于第9和第11个文件......但也许这是巧合。
我的XMeans电话看起来像这样:
DatabaseConnection dbc = new ArrayAdapterDatabaseConnection(data);
Database db = new StaticArrayDatabase(dbc, null);
db.initialize();
Relation<NumberVector> rel = db.getRelation(TypeUtil.NUMBER_VECTOR_FIELD);
DBIDRange ids = (DBIDRange) rel.getDBIDs();
SquaredEuclideanDistanceFunction dist = SquaredEuclideanDistanceFunction.STATIC;
RandomlyGeneratedInitialMeans init = new RandomlyGeneratedInitialMeans(RandomFactory.DEFAULT);
KMeansInitialization initializer = new FirstKInitialMeans();
PredefinedInitialMeans splitInitializer = new PredefinedInitialMeans(data);
KMeansQualityMeasure informationCriterion = new WithinClusterMeanDistanceQualityMeasure();
RandomFactory random = new RandomFactory(123);
KMeans<NumberVector, KMeansModel> innerKMeans = new KMeansHamerly<>(dist, 50, 1, init, true);
XMeans<NumberVector, KMeansModel> xm = new XMeans<>(dist, 5, 50, 1, innerKMeans, initializer, splitInitializer, informationCriterion, random);
Clustering<KMeansModel> c = xm.run(db, rel);
我对这四行不太确定,所以也许这就是为什么它适用于某些文件而其他文件不适用于
KMeansInitialization initializer = new FirstKInitialMeans();
PredefinedInitialMeans splitInitializer = new PredefinedInitialMeans(data);
KMeansQualityMeasure informationCriterion = new WithinClusterMeanDistanceQualityMeasure();
RandomFactory random = new RandomFactory(123);
data只是一个double [] [],其中包含输入文件中的数据。
任何帮助都将非常感谢!
答案 0 :(得分:0)
请使用参数化API配置X-means。
由于嵌套 k-means,很容易配置错误。
内部k-means类的初始值设定项必须设置为:
PredefinedInitialMeans splitInitializer = new PredefinedInitialMeans((double[][]) null);
KMeans<NumberVector, KMeansModel> innerKMeans = new KMeansHamerly<>(dist, 50, 1, splitInitializer, true);
因为否则X-means目前无法控制内部算法的初始化。我将删除此参数,并让XMeans设置内部算法的初始化程序。
没有堆栈跟踪(如@ Anony-Mousse所述),很难说发生了什么。我最好的猜测是这个元算法(运行另一种算法的算法!)没有正确配置,可能选择了错误的初始值?