Использование обучающих и тестовых данных в формате SvmLight с различным max-index в библиотеке Smile-ML - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь использовать Smile (https://github.com/haifengl/smile) для обучения SVM.

Мои данные приведены в формате SvmLight / LibSvm, поэтому я подумал, что, возможно, мне следует использовать читатель библиотеки, чтобы прочитать мои данные, и мягко согласился с этим руководством: https://github.com/haifengl/smile/wiki/Tutorial:-A-Gentle-Introduction-to-Smile.

LibsvmParser parser = new LibsvmParser();
    File training = new File("[...]");
    File testing = new File("[...]");
    try {
        SparseDataset trainingData = parser.parse(training);
        SparseDataset testingData = parser.parse(testing);

        double[][] trainVectors = trainingData.toArray();
        int[] trainClasses = trainingData.toArray(new int[trainingData.size()]);

        double[][] testVectors = testingData.toArray();
        int[] testClasses = testingData.toArray(new int[testingData.size()]);
[...]

Это приводит к тому, что векторы тренировок и тестов различаются по длине, поскольку максимальный индекс в наборе тренировок / тестов отличается. Я предположил бы, что предсказание от обученного SVM внутренне увеличило бы векторы признаков до общего размера, который, кажется, не делает. Это значит:

SVM<double[]> svm = new SVM<>(new GaussianKernel(8.0), 5.0, 2);
        svm.learn(trainVectors, trainClasses);
        svm.finish();

        int error = 0;
        for (int i = 0; i < testVectors.length; i++) {
            //ERROR in next line
            if (svm.predict(testVectors[i]) != testClasses[i]) {
                error++;
            }
        }

приводит к

Exception in thread "main" java.lang.IllegalArgumentException: Arrays have different length

в отмеченной строке.

Я пытался найти метод, родной для API, чтобы компенсировать разницу в длине, но мне не удалось найти его. Я что-то упустил / есть ли стандартный способ сделать это с помощью API?

Другими моими идеями было не использовать LibsvmParser и написать собственный анализатор который масштабирует оба набора до общей длины или вводит некоторую фиктивную переменную в набор данных, который обозначает общий наибольший индекс в каждой строке, но кажется невероятно хакерским и, как пустая трата ОЗУ, может привести к ненужным большим матрицам.

...