【问题标题】:using precomputed kernels with libsvm使用带有 libsvm 的预计算内核
【发布时间】:2011-12-04 15:13:32
【问题描述】:

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

但让我感到困惑的是如何输入训练输入。使用内核 MxM 的子集(M 是训练图像的数量),训练具有 M 个特征的 SVM。但是,如果我理解正确,这会限制我使用具有相似数量特征的测试数据。尝试使用大小为 MxN 的子内核,会在训练期间导致无限循环,因此,在测试时使用更多特征会导致较差的结果。

这导致使用相同大小的训练集和测试集给出合理的结果。但是,如果我只想分类,比如一张图像,或者为每个类使用给定数量的图像进行训练并用其余的图像进行测试,那么这根本行不通。

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

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

【问题讨论】:

  • 解决了它:给定一个用于训练的 Mx(M+1) 内核(+1 是强制性索引),测试内核应该(当然)大小为 Kx(M+1),其中K 是测试图像的数量。

标签: matlab machine-learning svm libsvm


【解决方案1】:

您似乎已经发现了问题...根据 MA​​TLAB 包中包含的 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

【讨论】:

  • 是的,我就是这样解决的。对使用内核的哪些部分有点困惑。不错的示例代码。
猜你喜欢
  • 2012-06-14
  • 2014-03-16
  • 2014-04-11
  • 2011-01-29
  • 2014-04-28
  • 2012-04-11
  • 2014-06-21
  • 1970-01-01
  • 2013-06-24
相关资源
最近更新 更多