2015-01-07 2 views
0

Для моего SVM обучения и прогнозирования я использую vl_svmtrain документацию, которую можно найти здесь: http://www.vlfeat.org/matlab/vl_svmtrain.htmlSVM предсказания данных в ячейках, а не ожидаемая матрице

[WB] = VL_SVMTRAIN (X, Y , LAMBDA) генерирует линейный вектор поддержки Машина (SVM) из векторов данных X и меток Y. X представляет собой матрицу D по N с одним столбцом на пример и размерными характеристиками D (SINGLE или DOUBLE). Y - ДВОЙНОЙ вектор с N элементами с бинарной (-1 или +1) меткой для каждой точки тренировки.

Согласно документации, данные X должны быть в матрице D на N, имеющей один образец на столбец.

Дело в том, что мои данные не устроены таким образом, и я не думаю, что смогу это устроить, даже если бы захотел. Каждое из моих изображений представлено матрицей признаков размером 512 * 257, они хранятся в ячейке. Аналогично, каждое тестовое изображение имеет одинаковый размер.

Так что для упрощения я предполагаю, что у меня есть только 3 класса, каждый класс представлен моделью размера 512 * 257, и у меня есть тысячи тестов, которые я должен сравнивать снова с каждой моделью, больше похожую на один против любого подхода , Но его расположение данных, с которыми я испытываю трудности.

Возможно ли представить данные в формате SVM в формате ячейки, а не в матричном формате?

Update:

Массив ячейки я уже состоит из 28 моделей. Таким образом, у меня есть в общей сложности 28 классов, каждый класс представлен массивом размером 512 * 257. Письмо models(1) представляет ans = [512x257 double] и написание models{1} производит двойную матрицу 512*257.

Это то, что я использую для обучения СВМ, аналогично, каждый тест имеет одинаковый размер и в том же расположении.

Как я получил эту матрицу для каждой модели? Я извлек функции RootSIFT из 100 изображений для каждого класса/модели. Затем я представил эти функции в сценарий модели гауссовой смеси и установил количество кластеров равным 512. Это дало мне средства, ковариации и веса 512 кластеров. Затем я конкатенировал их, используя models{i} = [gmm_models{i}.w(:) gmm_models{i}.mu' gmm_models{i}.sigma'];

Что касается теста, функции RootSIFT извлекаются из 5 изображений, а затем они проходят тот же процесс, что и для моделей, чтобы получить конкатенированную матрицу того же размера. Так что естественно для каждой модели есть сотни тестовых матриц.

Надеюсь, это разъяснило это больше, чем раньше.

+0

Является ли 512x257 случайным списком точек функции на изображении? С их полными дескрипторами? – Peter

+0

Это конкатенация параметров, генерируемых GMM. Таким образом, каждая ячейка является конкатенацией средств, ковариаций и весов. Известно, что эти функции дают хорошие результаты в соответствии с документом, опубликованным в марте прошлого года. – StuckInPhD

ответ

1

Невозможно представить данные в vl_svmtrain, кроме матрицы D x N, о которой идет речь. Тем не менее, что вы можете сделать, это развернуть массив ячеек и преобразовать каждую матрицу признаков так, чтобы он стал вектором столбца. Затем вы построили бы свою матрицу так, чтобы каждый вектор-столбец представлял одну матрицу признаков и объединил эти векторы столбцов по ширине, чтобы получить окончательную матрицу D x N.

Таким образом, вы можете выполнить некоторую предварительную обработку, чтобы получить желаемую матрицу X. Во-первых, разверните массив ячеек так, чтобы он стал 3D-матрицей, где каждый срез является одной функциональной матрицей. Затем измените эту матрицу так, чтобы каждый срез стал единственным столбцом для окончательной 2D-матрицы. Таким образом, сделать что-то вроде этого, при условии, что ваш массив ячеек хранится в A:

X_3D = cat(3, A{:}); 
X = reshape(X_3D, size(X_3D,1)*size(X_3D,2), []); 

X будет содержать что окончательное 2D матрицы мы говорили. Имейте в виду, что каждая матрица признаков будет развернута на основании . Это означает, что для каждой имеющейся матрицы характеристик столбцы располагаются друг над другом друг над другом, чтобы создать один столбец для выходной 2D-матрицы. Теперь вы можете использовать X для ввода в vl_svmtrain.

Тем не менее, я дам вам справедливое предупреждение о том, что каждая колонка технически будет 512 x 257 = 131584 элементов. Если у вас есть 1000 функциональных матриц, эта матрица может быть неосуществима для использования в vl_svmtrain из-за требований к памяти. Следовательно, вам может потребоваться либо подвыбрать вашу матрицу признаков, либо использовать уменьшенное количество матриц признаков для ввода.

Удачи вам!

+0

Спасибо. Это, к сожалению, изменит помощь svm? Будет ли работать лучше с libsvm? – StuckInPhD

+1

Я не думаю, что изменение того, какой SVM вы используете, поможет. Проблема заключается в том, сколько памяти ваши учебные данные занимают, поэтому переключение на 'libsvm', вероятно, ничего не сделает. Прошло довольно много времени, так как я использовал 'VLFeat', поэтому прежде чем мы что-нибудь сделаем, попробуйте запустить' vl_svmtrain' с этой измененной матрицей данных, как есть, и посмотрите, что вы получаете. – rayryeng

+0

@rayreng Первая команда произвела ошибку «ссылка на содержимое ячеек от объекта ячейки без ячейки», поэтому я изменил ее на «X_3D = cat (3, A (:));'. Но эта и другая команда дают тот же результат, оба производят то же самое, что '' A (:) '' будет генерировать вектор размера '' 131584 * 1''. Я не получаю 2D или 3D-матрицу. Спасибо – StuckInPhD

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