在libsvm中使用预计算的内核
libsvm
machine-learning
matlab
svm
7
0

我目前正在使用不同的图像描述符对图像进行分类。由于它们具有自己的指标,因此我使用的是预先计算的内核。因此,考虑到这些NxN个核矩阵(总共N个图像),我想训练和测试SVM。我对使用SVM并不是很有经验。

不过,令我困惑的是如何输入培训内容。使用内核MxM的子集(M是训练图像的数量)来训练具有M个功能的SVM。但是,如果我理解正确的话,这将限制我使用功能相似的测试数据。尝试使用大小为MxN的子内核会导致训练期间出现无限循环,因此,在测试结果不佳时使用更多功能。

这导致使用大小相等的训练和测试集,从而得出合理的结果。但是,如果我只想分类(比如说一张图片),或者为每个课程使用给定数量的图片进行训练,然后对其余图片进行测试,那么这根本不起作用。

如何消除训练图像数量和特征之间的依赖关系,以便可以测试任意数量的图像?

我将libsvm用于MATLAB,内核是[0,1]之间的距离矩阵。

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

您似乎已经发现了问题所在...根据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
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号