2014-11-13 1 views
0

Я пытаюсь реализовать свою собственную функцию перекрестной проверки для LIBSVM, однако я смущен тем, как обрабатывать структуры данных, которые были предоставлены мне на основе моего входные данные.Как разделить svm_problem на 5 сгибов для пользовательской проверки перекрестных ссылок - LIBSVM

Данные сохраняются в структуре svm_problem:

public class svm_problem implements java.io.Serializable 
{ 
    public int l; 
    public double[] y; 
    public svm_node[][] x; 
} 

Где: л длина блока данных; y - массив, содержащий их целевые значения; x - это массив указателей, каждый из которых указывает на представление одного обучающего вектора.

svm_node определяется как:

public class svm_node implements java.io.Serializable 
{ 
    public int index; 
    public double value; 
} 

Моя цель состоит в том, чтобы разделить обучающие данные на 5 складками, использовать 4 из них для обучения (функция svm_train), а также использовать один отдых, чтобы проверить результат (svm_predict), чтобы найти, какое значение C имеет наилучший результат предсказания (на основе функции ошибки).

Моя проблема заключается в том, как разделить данные на 5 складок с учетом структуры данных. Как структуры данных надлежащим образом разделены на 5 складок для того, чтобы мне приступить к оптимизации С.

Я использовал это в качестве руководства: A Practical Guide to Support Vector Classification

Если кто-то может дать пример или ссылку на пример о том, как это лучше всего сделать, было бы весьма полезно. Благодарю.

ответ

1

svm_problem описывает, i = 0, 1, ..., l - 1, что f(x[i]) РЕКОМЕНДУЕМЫХ приблизительно равную y[i] для изученной функции f. Каждый набор (x[i], y[i]) можно рассматривать как шумный образец функции f, которую вы пытаетесь найти.

Чтобы разбить ваш набор данных на обучение, перекрестные проверки и наборы данных для тестирования, вы можете просто разбить набор {0, 1, ..., l - 1} случайно на эти 3 части. Обычно это делается путем перетасовки списка номеров 0, 1, ..., l - 1, а затем «первые 60% номеров проходят обучение, следующие 20% - перекрестная проверка, следующие 20% - тестирование» или что-то подобное этому. Для каждого из этих подмножеств набора данных вы можете построить новый svm_problem, который описывает только эту часть данных.

+0

У меня уже есть два набора данных, один для обучения и один для тестирования. Я пытаюсь разбить набор данных обучения в 5 раз, чтобы выполнить перекрестную проверку, чтобы найти лучшее значение C. Это значение C будет использоваться, когда весь набор данных используется для обучения svm. Я не уверен, как проверить каждый набор, используя четыре других, чтобы найти лучший C. (C будет вручную обновлен мной). Должны ли четыре других быть объединены, а затем переданы в svm_train или каждый должен быть передан в svm_train отдельно? Функции включены в Libsvm. –

+0

@MattKoczwara Предполагая, что 'svm_train' поэтапно обновляет параметры модели, на самом деле не имеет значения, используете ли вы четыре экземпляра 20%' svm_problem' или один экземпляр 80% 'svm_problem'. Я не знаком с конкретной библиотекой, но способ, которым я описывал разделение данных, довольно универсален, когда дело доходит до материала для машинного обучения. –