我目前正致力于使用不同的图像描述符对图像进行分类。由于他们有自己的指标,我使用预先计算的内核。因此,考虑到这些NxN内核矩阵(总共N个图像),我想训练和测试SVM。虽然我对使用SVM不是很有经验。
令我困惑的是如何输入培训输入。使用内核MxM的子集(M是训练图像的数量),训练具有M个特征的SVM。但是,如果我理解正确,这限制了我使用具有相似数量的功能的测试数据。尝试使用大小为MxN的子内核,在训练期间会导致无限循环,因此,在测试时使用更多功能会产生不良结果。
这导致使用相同大小的训练和测试集给出合理的结果。但是,如果我只想分类,说一张图像,或者为每个班级训练一定数量的图像并用其余的训练,这根本不起作用。
如何消除训练图像和特征数量之间的依赖关系,以便我可以测试任意数量的图像?
我正在使用libsvm for MATLAB,内核是距离矩阵,范围在[0,1]之间。
答案 0 :(得分:41)
您似乎已经发现了问题...根据MATLAB包中包含的README文件:
要使用预先计算的内核,必须包含样本序列号 第一列培训和测试数据。
让我举一个例子说明:
%# 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