XMeans ELKI在每三个输入文件都失败

时间:2016-06-27 20:08:50

标签: cluster-analysis elki

我尝试使用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 [] [],其中包含输入文件中的数据。

任何帮助都将非常感谢!

1 个答案:

答案 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所述),很难说发生了什么。我最好的猜测是这个元算法(运行另一种算法的算法!)没有正确配置,可能选择了错误的初始值?