kmeans с разреженными векторами в elki

Когда я пробую этот метод с данными плотных векторов, он работает правильно, но с данными разреженных векторов выдает java.lang.ArrayIndexOutOfBoundsException. Какой источник данных я могу использовать для правильного чтения данных разреженных векторов?

public void runKmeans(double[][] data) {
ArrayAdapterDatabaseConnection dataArray = new ArrayAdapterDatabaseConnection(data);

ListParameterization params = new ListParameterization();
params.addParameter(AbstractDatabase.Parameterizer.DATABASE_CONNECTION_ID, dataArray);

Database db = ClassGenericsUtil.parameterizeOrAbort(StaticArrayDatabase.class, params);
db.initialize();


// Parameterization
//params = new ListParameterization();
params = new ListParameterization();
params.addParameter(KMeans.K_ID, k);
params.addParameter(KMeans.SEED_ID, 0);


// setup Algorithm
KMeansOutlierDetection<DoubleVector> kmeansAlg = ClassGenericsUtil.parameterizeOrAbort(KMeansOutlierDetection.class, params);
//testParameterizationOk(params);

// run KMEANS on database
OutlierResult result = kmeansAlg.run(db);
...

person Wesin Alves    schedule 19.01.2016    source источник
comment
Если я не ошибаюсь, ArrayAdapterDatabaseConnection поддерживает только плотные данные. DoubleVector также является плотным типом данных. Есть ли шанс, что вы неверно истолковали формат data?   -  person Has QUIT--Anony-Mousse    schedule 20.01.2016
comment
Кроме того, K-средние не имеют смысла для разреженных данных. Что бы вы ни пытались сделать - это неправильный алгоритм.   -  person Has QUIT--Anony-Mousse    schedule 20.01.2016
comment
Сначала я использовал ArrayList для чтения, поэтому я использовал метод toArray для его заполнения. Я пытался использовать kmeans, потому что, когда я использую графический интерфейс Elki, Kmeans может запускать мои разреженные данные в формате arff. Почему через Elki's Gui можно запустить Kmeans, а по коду нельзя   -  person Wesin Alves    schedule 20.01.2016
comment
Конечно, вы можете закодировать это, но эти классы не делают этого. double[] — это плотный формат. Вы можете создать свой собственный источник данных или использовать источник данных Arff, или, или, или, ... но, в конце концов, k-means предполагает плотные данные с теоретической точки зрения.   -  person Has QUIT--Anony-Mousse    schedule 20.01.2016
comment
Как бы вы осмысленно поместили вектор sparse в этот ArrayList?   -  person Has QUIT--Anony-Mousse    schedule 20.01.2016
comment
Я постепенно читаю разреженный файл arff, подобный этому @data {1 X, 3 Y, 4 "class A"} {2 W, 4 "class B"}, поэтому я использую arrlist.add(data). Когда я прекращаю чтение, я делаю inputMatrix = new double[arrlist.size()][arrlist.get(0).length]; inputMatrix = arrlist.toArray(inputMatrix);, потому что в моей программе я не могу напрямую читать файл arff, мне нужно читать его постепенно.   -  person Wesin Alves    schedule 20.01.2016
comment
Чтобы объяснить, почему k-means не имеет смысла для разреженных данных: k-means использует среднее. Он также предполагает фиксированную размерность d. Усреднение разреженных векторов разной длины уничтожает всю хорошую математическую поддержку алгоритма.   -  person Has QUIT--Anony-Mousse    schedule 20.01.2016
comment
И как вы храните эти данные в double[]? Почему бы вам не включить весь этот код в вопрос? Кроме того, это похоже на категориальные данные, k-средние требуют непрерывных данных.   -  person Has QUIT--Anony-Mousse    schedule 20.01.2016
comment
это был просто пример. Мои данные действительно непрерывные данные. я объявляю inputMatrix как double[][]. После сохранения я звоню runKmeans(inputMatrix);   -  person Wesin Alves    schedule 20.01.2016
comment
я согласен, что kmeans не имеет смысла для разреженных данных. Я просто думаю, что странный графический интерфейс Elki может запускать разреженный файл arff без исключения java.lang.ArrayIndexOutOfBoundsException.   -  person Wesin Alves    schedule 20.01.2016
comment
Но double[][] плотный, а вам нужны разреженные данные! Что бы вы ни делали (добавьте код подготовки к вашему вопросу, пожалуйста), вы не создаете разреженные векторы.   -  person Has QUIT--Anony-Mousse    schedule 20.01.2016
comment
Кроме того, то, как вы, кажется, его инициализируете (с toArray), делает его, вероятно, неквадратным (из-за рваных массивов). Возможно, это вызывает ошибку. Убедитесь, что все строки имеют одинаковую длину (но опять же, это плотный формат, который вы используете).   -  person Has QUIT--Anony-Mousse    schedule 20.01.2016
comment
строки не имеют одинаковой длины. Итак, вы пытаетесь сказать мне, что мне нужно использовать что-то вроде SparseDoubleVector от Elki для хранения разреженных данных?   -  person Wesin Alves    schedule 20.01.2016


Ответы (1)


Класс ArrayAdapterDatabaseConnection можно использовать только для плотных векторов. Вы должны предоставить массив квадрат double[][].

Вы можете использовать FileBasedDatabaseConnection и ArffParser для чтения разреженных данных. Или вы можете реализовать свой собственный DatabaseConnection, это единственный метод, loadData().

DoubleVector — это плотный тип данных. SparseDoubleVector — разреженный векторный тип. Для этого DoubleVector поддерживается плотным массивом double[], тогда как SparseDoubleVector использует int[] с ненулевыми размерностями плюс double[] с ненулевыми значениями только.

K-means требует фиксированной размерности для распределения средних векторов (они всегда будут плотными), поэтому не забудьте указать VectorFieldTypeInformation с максимальной размерностью. Существует фильтр преобразования типов, который просто сканирует набор данных один раз и соответствующим образом устанавливает размерность.

person Erich Schubert    schedule 20.01.2016