2016-06-27 7 views
2

Я пытаюсь скопировать данные изображения (хранятся в 100 отдельных файлах csv) с алгоритмом ELMI XMeans. Он хорошо работает для первых двух файлов, но тогда алгоритм зависает навсегда при обработке третьего файла. Похоже, проблема возникает в каждом третьем файле или так, потому что, когда я запускаю цикл, который просматривает все файлы в четвертом файле, он работает для четвертого и пятого файлов, но не для шестого файла. То же самое касается 9-го и 11-го файлов ... но, возможно, это совпадение.XMeans ELKI терпит неудачу при каждом третьем входном файле

Мой 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); 

данные - это всего лишь двойной [] [], который содержит данные из входных файлов.

Любая помощь будет очень признательна!

+1

Насколько велики файлы? * что такое трассировка стека *? Одна действительно приятная вещь о Java - это возможность видеть, где сейчас находятся потоки. –

+0

Размер файла всегда 60 КБ. – Charlie28000

ответ

0

Пожалуйста, используйте API параметризации для настройки X-средств.

Из-за вложенных k-mean, очень легко настроить ситуацию плохо.

Инициализатором внутреннего класса к-средство должно быть установлено следующее:

PredefinedInitialMeans splitInitializer = new PredefinedInitialMeans((double[][]) null); 

KMeans<NumberVector, KMeansModel> innerKMeans = new KMeansHamerly<>(dist, 50, 1, splitInitializer, true); 

, потому что в противном случае X-средства в настоящее время не может контролировать инициализацию внутреннего алгоритма. Я удалю этот параметр, и XMeans установит инициализатор внутреннего алгоритма.

Без трассировки стека (как упоминается @ Anony-Mousse) трудно сказать, что происходит. Мое лучшее предположение заключается в том, что этот мета-алгоритм (алгоритм, который запускает другой алгоритм!) Неправильно настроен и, возможно, выбирает плохие начальные значения?

+0

Большое спасибо за ваш ответ, я изменил код соответствующим образом, но теперь я получаю исключение Null Pointer для строки splitInitializer: «Исключение в потоке» main »java.lang.NullPointerException \t at de.lmu.ifi .dbs.elki.algorithm.clustering.kmeans.initialization.PredefinedInitialMeans.setInitialMeans (PredefinedInitialMeans.java:109) \t at de.lmu.ifi.dbs.elki.algorithm.clustering.kmeans.initialization.PredefinedInitialMeans. (PredefinedInitialMeans.java:72) ' – Charlie28000

+0

О, похоже, сейчас работает. Я изменил код на это: 'PredefinedInitialMeans splitInitializer = new PredefinedInitialMeans (data); \t KMeans innerKMeans = new KMeansHamerly <> (dist, 50, 1, splitInitializer, true); ' Надеюсь, все в порядке. – Charlie28000

+0

Вышеуказанный код (с литой и «нулевой») должен работать, поскольку это то, что 'XMeans.Parameterizer' делает, по крайней мере, в текущем git. Передача 'data' здесь не имеет особого смысла, поскольку предопределенные средства не являются вашим полным набором данных. Вы можете попробовать 'new double [0] [0] {}' тоже. –