簡體   English   中英

使用預先計算的內核和libsvm

[英]using precomputed kernels with libsvm

我目前正致力於使用不同的圖像描述符對圖像進行分類。 由於他們有自己的指標,我使用預先計算的內核。 因此,考慮到這些NxN內核矩陣(總共N個圖像),我想訓練和測試SVM。 雖然我對使用SVM不是很有經驗。

令我困惑的是如何輸入培訓輸入。 使用內核MxM的子集(M是訓練圖像的數量),訓練具有M個特征的SVM。 但是,如果我理解正確,這限制了我使用具有相似數量的功能的測試數據。 嘗試使用大小為MxN的子內核,在訓練期間會導致無限循環,因此,在測試時使用更多功能會產生不良結果。

這導致使用相同大小的訓練和測試集給出合理的結果。 但是,如果我只想分類,說一張​​圖像,或者為每個班級訓練一定數量的圖像並用其余的訓練,這根本不起作用。

如何消除訓練圖像和特征數量之間的依賴關系,以便我可以測試任意數量的圖像?

我正在使用libsvm for MATLAB,內核是距離矩陣,范圍在[0,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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM