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