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

Я пытаюсь использовать 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 и написать собственный синтаксический анализатор, который масштабирует оба набора до общей длины, или ввести некоторую фиктивную переменную в набор данных, который обозначает общий наибольший индекс в каждой строке, но который кажется невероятно хакерским и как пустая трата оперативной памяти, поскольку это может привести к ненужным большим матрицам.

0 ответов

Другие вопросы по тегам