2015-04-26 5 views
2

Я пытаюсь обучить SVM, чтобы классифицировать две спиральные данные.Encog SVM wont train

Мой вход представляет собой файл с тремя столбцами CSV, первые два столбца представляют собой (x, y) -координаты точки на спирали (не нормированные), а третий столбец - это спираль (класс), который принадлежит точке к.

Сначала я нормализую CSV-файл, чтобы первые два столбца находились между 0 и 1 (третий столбец не изменился).

Затем я создаю и обучать SVM следующим

CSVNeuralDataSet trainingSet = new CSVNeuralDataSer(normaliseCSV("/path/to/data/file"), 2, 1, false); 

SVM svm = new SVM(2, false); 

final SVMSearchTrain train = new SVMSearchTrain(svm, trainingSet); 

int epoch = 0; 

do { 
    train.iteration(); 
    System.out.println("Epoch $: " + epoch + " Error: " + train.getError()); 
    epoch++; 
} while(train.getError() > 0.01); 

train.finishTraining(); 

Однако делать ... в то время как цикл заканчивает тем, что бесконечный цикл, как ошибка обучения составляет около 0,4, и это никогда не изменится.

Набор данных содержит около 200 выборок и существует только два класса (0 и 1).

Может ли кто-нибудь сказать мне, почему это не удается?

EDIT: Here is a pastebin link примерно до 10% от данных обучения.

С наилучшими пожеланиями

Bidski

+0

Можете ли вы поделиться фрагментом нормализованных данных? –

+0

Отредактировано для добавления ссылки на образцы данных. – Bidski

ответ

2

Замечательный вопрос. Ваша проблема в том, что SVM не может построить разделительную кривую для спиральных данных. Я предлагаю вам попробовать трюк нормализации, но нормализовать не по координатам X, Y как прямые, а switch - polar system of coordinates. И рассмотрим, вероятно, архимедову спираль, логарифмическую спираль и т. Д. enter image description here. Посмотрите на картинку. Спиральные данные требуют от SVM построить некоторую функцию, которая будет разделять данные между Class 1 и Class 2, и я уверен, что это непростая задача для SVM. Но если вы найдете способ перейти от представления данных спирали к линейному, тогда SVM потребуется построить разделение между двумя кривыми, что намного проще.

+0

Также убедитесь, что класс 1 и класс 2 не пересекаются –

Смежные вопросы