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