использование предварительно вычисленных ядер с помощью libsvm - PullRequest
20 голосов
/ 10 октября 2011

В настоящее время я работаю над классификацией изображений с различными дескрипторами изображений.Поскольку они имеют свои собственные метрики, я использую предварительно вычисленные ядра.Итак, учитывая эти NxN-матрицы (всего N изображений), я хочу обучить и протестировать SVM.Хотя я не очень опытен в использовании SVM.

Что меня смущает, так это то, как вводить данные для тренировки.Используя подмножество ядра MxM (M - количество обучающих образов), обучает SVM с помощью M функций.Однако, если я правильно понял, это ограничивает меня в использовании тестовых данных с аналогичным набором функций.Попытка использовать ядро ​​размера MxN приводит к бесконечным циклам во время обучения, следовательно, использование большего количества функций, когда тестирование дает плохие результаты.

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

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

Я использую libsvm для MATLAB, ядра - это матрицы расстояний в диапазоне [0,1].

1 Ответ

41 голосов
/ 15 октября 2011

Вы, похоже, уже выяснили проблему ... Согласно файлу README, включенному в пакет MATLAB:

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

Позвольте мне проиллюстрировать на примере:

%# read dataset
[dataClass, data] = libsvmread('./heart_scale');

%# split into train/test datasets
trainData = data(1:150,:);
testData = data(151:270,:);
trainClass = dataClass(1:150,:);
testClass = dataClass(151:270,:);
numTrain = size(trainData,1);
numTest = size(testData,1);

%# radial basis function: exp(-gamma*|u-v|^2)
sigma = 2e-3;
rbfKernel = @(X,Y) exp(-sigma .* pdist2(X,Y,'euclidean').^2);

%# compute kernel matrices between every pairs of (train,train) and
%# (test,train) instances and include sample serial number as first column
K =  [ (1:numTrain)' , rbfKernel(trainData,trainData) ];
KK = [ (1:numTest)'  , rbfKernel(testData,trainData)  ];

%# train and test
model = svmtrain(trainClass, K, '-t 4');
[predClass, acc, decVals] = svmpredict(testClass, KK, model);

%# confusion matrix
C = confusionmat(testClass,predClass)

Вывод:

*
optimization finished, #iter = 70
nu = 0.933333
obj = -117.027620, rho = 0.183062
nSV = 140, nBSV = 140
Total nSV = 140
Accuracy = 85.8333% (103/120) (classification)

C =
    65     5
    12    38
...